본문 바로가기
알고리즘/백트래킹

백준 14888번 : 연산자 끼워넣기 java

by LDY3838 2022. 5. 24.
반응형

백준에서 백트래킹 항목에 해당하는 문제는 연산자 끼워넣기입니다.

 

이 문제는 숫자를 몇 개를 입력받을 것인지를 먼저 입력받은 후 그 사이즈만큼 숫자를 입력받으면 됩니다.

 

이 문제에서는 연산자를 '+', '-', '*', '/', 이 4개만 사용하므로 연산자를 저장할 배열은 4개의 공간이 필요할 것입니다.

 

추가 설명은 코드를 보면서 하겠습니다.

 


 

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

public class Main{
    static int[] num;

    static int N;
    static int min = Integer.MAX_VALUE;
    static int max = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        num = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i = 0; i<N; i++)
            num[i] = Integer.parseInt(st.nextToken());

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

        dfs(num[0], 0, calc);

        System.out.println(max+"\n"+min);
    }

    static void dfs(int sum, int cnt, int[] calc){
        if(cnt == N - 1){
            min = Math.min(min, sum);
            max = Math.max(max, sum);
            return;
        }

        for(int i = 0; i<4; i++){
            if(calc[i] == 0)
                continue;

            int nextSum = sum;

            switch(i){
                case 0:
                    nextSum += num[cnt+1];
                    break;
                case 1:
                    nextSum -= num[cnt+1];
                    break;
                case 2:
                    nextSum *= num[cnt+1];
                    break;
                case 3:
                    nextSum /= num[cnt+1];
                    break;
            }

            calc[i]--;
            dfs(nextSum, cnt+1, calc);
            calc[i]++;
        }
    }
}

 

이 문제에서 숫자들의 순서는 변하지 않습니다.

 

그렇다면 우리는 연산자들만 이동시켜주면서 앞에서부터 연산을 진행하면 됩니다.

 

이를 위하여 숫자의 배열은 main 밖에 선언하여 dfs함수로 재귀할 때 매개변수로 받지 않아도 되게 만들었습니다.

-> 숫자들의 순서는 변하지 않기 때문에 배열의 변화가 없어 이렇게 했습니다.

 

연산자들은 4가지의 종류만 있고 들어오는 순서도 이미 정해져 있기 때문에 int의 배열로 갯수를 입력받았습니다.

->char[]로 선언해서 구현하더라도 switch문을 이용하는데 전혀 지장이 없습니다.

 

dfs 함수는 calc 배열을 매개변수로 받아 변화된 배열을 재귀할 때 넘겨주고 cnt 변수로 지금이 몇 번째 재귀인지를     알 수 있게 했으며 nextSum으로 지금까지의 연산 결과를 저장하여 전역 변수인 max, min과 비교하게 만들었습니다.

반응형

'알고리즘 > 백트래킹' 카테고리의 다른 글

백준 15657번 : N과 M (8) java  (0) 2022.06.10
백준 15663번 : N과 M (9) java  (0) 2022.06.03
백준 15654번 : N과 M(5) java  (0) 2022.05.31
백준 14889번 : 스타트와 링크 java  (0) 2022.05.25
백준 9663번 : N-Queen java  (0) 2022.05.25

댓글