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

seren-dev·2022년 8월 30일
0

백트래킹

목록 보기
7/8

https://www.acmicpc.net/problem/14888
삼성 SW 역량 테스트 기출 문제

풀이

DFS를 사용하여 모든 경우의 수를 탐색해 최솟값과 최댓값을 구한다.

코드

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

public class Main {

    static int n, min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
    static int[] arr;
    static int[] operator = new int[4];

    public static void operation(int idx, int value) {
        if (idx == n) {
            min = Math.min(min, value);
            max = Math.max(max, value);
            return;
        }

        int num = arr[idx];
        for (int i = 0; i < 4; i++) {
            if (operator[i] != 0) {
                operator[i]--;
                switch(i) {
                    case 0: operation(idx+1, value+num); break;
                    case 1: operation(idx+1, value-num); break;
                    case 2: operation(idx+1, value*num); break;
                    case 3: operation(idx+1, value/num); break;
                }
                operator[i]++;
            }
        }

    }

    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];

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

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

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

        operation(1, arr[0]);

        System.out.print(max + "\n" + min);
    }
}
  • operator 배열에 각 연산자의 개수를 저장한다.
  • 재귀함수 내 for문에서 연산자 개수가 0 이상인 경우(operator[i] != 0) 해당 연산자 개수를 1 감소하고 재귀호출을 한다.
  • 모든 피연산자를 다 쓴 경우(idx == n) 값을 비교하여 min, max 값을 업데이트한다.

0개의 댓글