백준 알고리즘/Java

[백준] 14888. 연산자 끼워넣기 - Java

리버🐦‍🔥 2025. 4. 21. 21:26

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

 

⭐️ 중요 포인트

1. 이번 재귀는 return값이 없는 재귀함수이다 -> min과 max값을 모두 구해야하기 때문에 void로 return값을 설정하고 기저사례를 만났을 때, min과 max를 갱신한다

2. 모든 조건을 재귀를 통해 반복한다.

 

import java.util.*;
import java.io.*;

public class P14888 {

    static BufferedReader br;
    static BufferedWriter bw;
    static StringTokenizer st;

    static int N;
    static int[] A;
    static int[] operCnt;
    static int min;
    static int max;

    static void init() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());
        A = new int[N];
        min = 1000000001;
        max = -1000000001;

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }

        operCnt = new int[4];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 4; i++) {
            operCnt[i] = Integer.parseInt(st.nextToken());
        }
    }

    // idx(몇 번째 순서인지), oper(어떤 연산자를 사용해야 하는지)
    static void recursion(int idx, int ret) throws IOException {

        // 기저 사례 1. N번째 숫자까지 모두 더한 경우
        if (idx == N - 1) {
            min = Math.min(ret, min);
            max = Math.max(ret, max);
            return;
        }

        for (int i = 0; i < 4; i++) {
            if (operCnt[i] > 0) {
                operCnt[i]--;
                if (i == 0) {
                    recursion(idx + 1, ret + A[idx + 1]);
                } else if (i == 1) {
                    recursion(idx + 1, ret - A[idx + 1]);
                } else if (i == 2) {
                    recursion(idx + 1, ret * A[idx + 1]);
                } else if (i == 3) {
                    recursion(idx + 1, ret / A[idx + 1]);
                }
                operCnt[i]++;
            }
        }

    }

    public static void main(String[] args) throws IOException {

        init();

        recursion(0, A[0]);

        bw.write(max + "\n" + min);

        bw.flush();
        bw.close();
        br.close();

    }
}