알고리즘

bj16637-괄호 추가하기(구현, 재귀)

쥐4 2025. 4. 5. 20:40

https://www.acmicpc.net/problem/16637

연산을 어떻게 코드로 짤 지 고민을 해보아야하는 문제이다.

숫자 따로, 연산 문자 따로 나눠 배열로 처리하면 쉽게 풀 수 있다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static int N, answer = Integer.MIN_VALUE;
    static int[] nums;
    static char[] cals;
    static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        initialize();
        solve(0,nums[0]);
        System.out.println(answer);
    }

    private static void solve(int index, int value) {
        if(index >= N/2){
            answer = Math.max(value, answer);
            return;
        }

        //바로 계산 후 넘어가기
        solve(index+1, calculate(cals[index], value, nums[index+1]));
        //다음꺼 괄호 계산 후 넘어가기
        if(index >= N/2-1)return;
        solve(index+2, calculate(cals[index], value, calculate(cals[index+1], nums[index+1], nums[index+2])));
    }

    private static int calculate(char cal, int i1, int i2) {
        switch (cal) {
            case '+':
                return i1 + i2;
            case '-':
                return i1 - i2;
            case '*':
                return i1 * i2;
        }
        return 0;
    }

    private static void initialize() throws IOException {
        N = Integer.parseInt(bufferedReader.readLine());
        nums = new int[N/2 + 1];
        cals = new char[N/2];
        String rawLine = bufferedReader.readLine();
        for(int i = 0; i < N; i++){
            if(i % 2 == 0) {
                nums[i/2] = Character.getNumericValue(rawLine.charAt(i));
                continue;
            }
            cals[i/2] = rawLine.charAt(i);
        }
    }
}