[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/67257
[풀이]
먼저 피연산자와 연산자를 분리해서 List에 넣은 후, 모든 연산자의 우선순위 순열에 대해 값을 계산해준다.
+, *, - 3가지 연산자에 대해서 가능한 우선순위는 3!=6가지이다. dfs를 통해 이에 대한 순열을 구할 수 있다.
그 후 연산자 우선순위에 따라서 계산해준 후 최대값을 비교해서 얻어낸다.
[코드]
import java.util.*;
class Solution {
static long answer = 0;
static String op[] = {"+","-","*"};
static boolean[] visited = new boolean[3];
static ArrayList<Long> numList = new ArrayList<>();
static ArrayList<String> opList = new ArrayList<>();
static String[] perm = new String[3];
public long solution(String expression) {
String num = "";
//op, num 구분
for(int i=0; i<expression.length(); i++){
char c = expression.charAt(i);
if(c=='*' || c=='+' || c=='-'){
opList.add(c+"");
numList.add(Long.parseLong(num));
num = "";
}
else{
num += c;
}
}
//마지막 숫자
numList.add(Long.parseLong(num));
//순열 만들기
makePermutation(0);
return answer;
}
static void makePermutation(int depth){
if(depth==op.length){
//3개를 선택함 -> 연산
sol();
return;
}
for(int i=0; i<op.length; i++){
if(visited[i]) continue;
visited[i] = true;
perm[depth] = op[i];
makePermutation(depth+1);
visited[i] = false;
}
}
static void sol(){
//list 복사
ArrayList<String> oper = new ArrayList<String>();
oper.addAll(opList);
ArrayList<Long> num = new ArrayList<Long>();
num.addAll(numList);
//연산자 우선순위에 따라 계산
for(int i=0; i<perm.length; i++){
String op = perm[i];
for(int j=0; j<oper.size(); j++){
if(oper.get(j).equals(op)){
long n1 = num.get(j);
long n2 = num.get(j+1);
long res = cal(n1, n2, op);
//list 갱신
num.remove(j+1);
num.remove(j);
oper.remove(j);
num.add(j, res);
j--;
}
}
}
answer = Math.max(answer, Math.abs(num.get(0)));
}
static long cal(long n1, long n2, String op){
long res = 0;
switch(op){
case "*":
res = n1 * n2;
break;
case "+":
res = n1 + n2;
break;
case "-":
res = n1 - n2;
break;
}
return res;
}
}
'알고리즘 공부 및 문제 풀이 > 프로그래머스(PRO)' 카테고리의 다른 글
[pro] 프로그래머스 level3 68646 풍선 터뜨리기 (Java) - 시뮬레이션 (0) | 2023.01.08 |
---|---|
[pro] 프로그래머스 level3 64062 징검다리 건너기 (Java) - 이분탐색 (0) | 2022.12.15 |
[pro] 프로그래머스 level3 67259 경주로 건설 (Java) - BFS (0) | 2022.12.14 |
[pro] 프로그래머스 level3 67258 보석 쇼핑 (Java) - 투포인터 (1) | 2022.12.14 |
[pro] 프로그래머스 level1 67256 키패드 누르기 (Java) (0) | 2022.12.13 |