Problem Solving/Baekjoon

[백준] 16637 괄호 추가하기 - Brute Force / Java

graycode 2022. 8. 8. 22:28

 문제 링크

 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가

www.acmicpc.net

 

 풀이 과정

재귀 호출 함수를 통해 다음 연산에 괄호를 사용해 연산할 지, 그대로 연산할 지 두가지 경우를 모두 계산한다.

 

크기가 수식의 길이 n 인 char 배열 input 을 생성해 입력받은 수식을 저장한 후,

인덱스 변수를 idx 로 정의하고 정수의 경우 input[idx] - '0' 로 호출, 연산자는 input[idx] 로 호출한다.

 

호출한 정수와 연산자에 맞게 연산값을 반환할 cal 함수를 생성하고,

연산의 결과가 누적될 값 res, input 배열을 탐색할 인덱스 값 idx 를 재귀 함수 recur 의 매개 변수로 지정한다.

 

예시로 A + B * C 의 수식이 존재할 경우, 초기 res 값은 A 가 되고,

괄호를 사용하지 않을 시 A + B 의 값을 res 값으로써 재귀 함수에 전달하거나,

괄호를 사용 시 B * C 의 값을 먼저 구한 후, A + (B * C) 의 값을 res 값으로써 재귀 함수에 전달하는 두 경우가 있다.

 

이렇게 괄호가 생성될 수 있는 각각의 분기마다 모든 경우를 구해 연산한 후,

연산의 결과값을 max 값과 비교하여 최대값으로 갱신하여 max 의 최종값을 정답으로써 출력한다.

 

 풀이 코드

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

public class Main {

    static int n;
    static int max = Integer.MIN_VALUE;
    static char[] input;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        n = Integer.parseInt(br.readLine());
        input = new char[n];
        input = br.readLine().toCharArray();

        recur(input[0] - '0', 2);

        bw.write(max + "\n");
        bw.flush();
    }

    private static void recur(int res, int idx) {
        if (idx >= n) {
            max = Math.max(max, res);
            return;
        }

        recur(cal(res, input[idx] - '0', input[idx - 1]), idx + 2);

        if (idx + 2 < n) {
            int bracket = cal(input[idx] - '0', input[idx + 2] - '0', input[idx + 1]);
            recur(cal(res, bracket, input[idx - 1]), idx + 4);
        }
    }

    private static int cal(int x, int y, char op) {
        if (op == '+')
            return x + y;
        else if (op == '-')
            return x - y;
        else
            return x * y;
    }

}