
-Code
import java.util.*;
import java.util.stream.*;
class Solution {
// 연산자 우선순위 조합이 정해져 있으므로 선언
static char[][] priorities = {
{'+', '-', '*'}, {'+', '*', '-'},
{'-', '+', '*'}, {'-', '*', '+'},
{'*', '+', '-'}, {'*', '-', '+'}
};
public long solution(String expression) {
// 숫자들만 리스트로 저장
List<Long> nums = Arrays.stream(expression.split("[*+-]"))
.mapToLong(Long::parseLong)
.boxed()
.collect(Collectors.toList());
// 연산자 저장
List<Character> opList = new ArrayList<>();
for (char ch : expression.toCharArray()) {
if (!Character.isDigit(ch)) {
opList.add(ch);
}
}
// 현재 연산자들의 모든 우선 순위 변경 조합 구하기
long answer = 0;
for (char[] priority : priorities) {
// 계신시 값을 지우므로 계속 갱신
List<Long> tempNums = new ArrayList<>(nums);
List<Character> tempOp = new ArrayList<>(opList);
for (char op : priority) {
int idx = 0;
// for문으로 하면 변경된 리스트로 오류 발생
while (idx < tempOp.size()) {
if (op == tempOp.get(idx)) {
// 연산을 바탕으로 계산
long num1 = tempNums.get(idx);
long num2 = tempNums.get(idx + 1);
long calcNum = calc(op, num1, num2);
// 계산하므로 다음 수 제거
tempNums.remove(idx + 1);
// 현재 수를 교체
tempNums.set(idx, calcNum);
// 사용 연산자 제거
tempOp.remove(idx);
continue;
}
// 계산을 하지 않은 경우에만 idx 증가
idx++;
}
}
answer = Math.max(answer, Math.abs(tempNums.get(0)));
}
return answer;
}
// op에 따른 계산
private long calc(char op, long num1, long num2) {
switch (op) {
case '*': return num1 * num2;
case '+': return num1 + num2;
default: return num1 - num2;
}
}
}
우선순위를 가지고 계산하는 문제인 줄 알았는데 3개의 연산자의 모든 우선순위 조합에 대해서 최대 값을 찾는 문제였습니다.
그걸 알게 된 후 로직을 짰다가 연산이 진행되면 수를 삭제해야 하는데 너무 짧게 생각하여 그 부분에서 생각을 못하고 배열로 하다가 다시 수정했습니다.
또한 제거하면서 계산을 할 때 idx를 for문으로 해서 index오류가 생겨서 while로 변경하고 값을 수정하고 지우는 과정에서 index오류도 생겨서 해당 부분을 해결하여 통과했습니다. 생각을 더 길게 했으면 빨리 해결할 수 있었을 것 같은데 생각을 좀 짧게 해서 아쉬운 문제였습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 4368번 Babelfish (0) | 2026.04.11 |
|---|---|
| [백준/Java] 28345번 Image Filter (0) | 2026.04.10 |
| [프로그래머스/Java] 연속된 부분 수열의 합 (0) | 2026.04.09 |
| [백준/Java] 10176번 Opposite Words (0) | 2026.04.09 |
| [프로그래머스/Java] 큰 수 만들기 (0) | 2026.04.09 |