본문 바로가기
Backend/알고리즘

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

by 박상윤 2023. 11. 30.

문제

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

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱

www.acmicpc.net

 

사고의 흐름

덧셈, 뺄셈, 곱셈, 나눗셈의 갯수를 재귀호출로 줄여나가면서 값을 계산해주자

 

풀이

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

public class Main {

    public static int N;
    public static int[] arr;
    public static int[] operator; // +, -, *, /

    public static int maxValue = Integer.MIN_VALUE;
    public static int minValue = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        // 완전탐색
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        arr = new int[N];
        operator = new int[4];

        StringTokenizer stk = new StringTokenizer(br.readLine());

        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(stk.nextToken());
        }

        stk = new StringTokenizer(br.readLine());

        for (int i = 0; i < 4; i++) {
            operator[i] = Integer.parseInt(stk.nextToken());
        }

        go(arr[0], 0, operator[0], operator[1], operator[2], operator[3]);

        System.out.println(maxValue);
        System.out.println(minValue);

    }

    public static void go(int cur, int index, int plus, int minus, int multi, int divide) {
        if (index == N - 1) {
            maxValue = Math.max(cur, maxValue);
            minValue = Math.min(cur, minValue);
            return;
        }

        if (plus > 0) {
            go(cur + arr[index + 1], index + 1, plus - 1, minus, multi, divide);
        }

        if (minus > 0) {
            go(cur - arr[index + 1], index + 1, plus, minus - 1, multi, divide);
        }

        if (multi > 0) {
            go(cur * arr[index + 1], index + 1, plus, minus, multi - 1, divide);
        }

        if (divide > 0) {
            go(cur / arr[index + 1], index + 1, plus, minus, multi, divide - 1);
        }
    }
}

'Backend > 알고리즘' 카테고리의 다른 글

이분탐색  (1) 2023.12.07
[백준] 2776번 - 암기왕  (2) 2023.12.07
[백준] 1911 - 흙길 보수하기  (1) 2023.11.30
[백준] 15662 - 톱니바퀴  (0) 2023.11.29
[백준] 17406 : 배열 돌리기  (1) 2023.11.28