728x90
이 문제는 숫자와 세 가지 기본 연산자만을 포함하는 문자열 형태의 수식을 받습니다. 주어진 수식에서 연산자의 우선순위를 자유롭게 재정의하여 수행 결과로 가능한 가장 큰 숫자를 찾아야 합니다. 연산 결과가 음수인 경우, 그 절댓값을 최종 값으로 제출합니다.
1.연산자 우선순위 조합생성 : 가능한 모든 연산자 우선 순위 조합은 세가지 연산자가 있으므로 3!=6 가지 조합이 가능합니다.
2.수식계산 : 각 우선순위 조합에 따라 수식을 계산합니다. 연산자에 따라 수식을 분할하고, 지정된 우선순위에 따라 숫자를 계산합니다
구현 방법
1.수식 파싱 : 주어진 수식을 숫자와 연산자로 분리합니다.
2.우선순위 설정 및 계산 : 세 가지 연산자에 대한 모든 우선순위 조합을 설정하고, 각 조합에 따라 수식을 계산합니다.
import java.util.ArrayList;
import java.util.List;
class Solution {
public long solution(String expression) {
long answer = 0;
String[] priority = {"*,+,-" , "*,-,+","-,*,+","-,+,*","+,-,*","+,*,-"};
//문자열 List 형식으로 변환
StringBuilder sb = new StringBuilder();
List<String> li = new ArrayList<>();
for(char c : expression.toCharArray()){
if(c == '*' || c=='-' || c=='+'){
li.add(sb.toString());
li.add(String.valueOf(c));
sb = new StringBuilder();
}else{
sb.append(c);
}
}
li.add(sb.toString());
for(int i=0; i< priority.length; i++){
String[] operators = priority[i].split(",");
List<String> liTemp = new ArrayList<>(li);
for(int j=0; j< operators.length; j++){
String operator = operators[j]; //기호
for(int k=0; k < liTemp.size(); k++){ //기호에 따른 계산
if(liTemp.get(k).equals(operator)){
Long temp = cal(Long.parseLong(liTemp.get(k-1)) , Long.parseLong(liTemp.get(k+1)) , operator);
liTemp.remove(k-1);
liTemp.remove(k-1);
liTemp.remove(k-1);
liTemp.add(k-1 , String.valueOf(temp));
k=0;
}
}
}
answer = Math.max( Math.abs(answer) , Math.abs(Long.parseLong(liTemp.get(0))) );
}
return answer;
}
private static long cal(long a , long b , String operator){
switch (operator){
case "*":
return a*b;
case "-":
return a-b;
case "+":
return a+b;
}
return 0;
}
}
효율적이지 못해 보이네요...
그리고 if(c == '*' || c=='-' || c=='+') 이 부분을 => if(Character.isDigit(c)) 로 하면 더 좋아보이네요.
728x90