본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] 수식 최대화

by 현장 2026. 4. 10.

-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오류도 생겨서 해당 부분을 해결하여 통과했습니다. 생각을 더 길게 했으면 빨리 해결할 수 있었을 것 같은데 생각을 좀 짧게 해서 아쉬운 문제였습니다.