백준 14888 연산자 끼워넣기(Java,자바)

jonghyukLee·2021년 9월 30일
0

이번에 풀어본 문제는
백준 14888번 연산자 끼워넣기 입니다.

📕 문제 링크

❗️코드

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

public class Main {
    static int [] map,op;
    static int N;
    static int min = Integer.MAX_VALUE, 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());
        map = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());

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

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

        calc(1,map[0]);
        System.out.printf("%d\n%d",max,min);
    }
    static void calc(int idx, int num)
    {
        if(idx == N)
        {
           min = Math.min(num,min);
           max = Math.max(num,max);
           return;
        }

        for(int i = 0; i < 4; ++i) // + - x /
        {
            if(op[i] > 0)
            {
                op[i]--;
                if(i == 0) calc(idx+1,num + map[idx]);
                else if(i == 1) calc(idx+1,num - map[idx]);
                else if(i == 2) calc(idx+1,num * map[idx]);
                else calc(idx+1, num / map[idx]);
                op[i]++;
            }
        }
    }
}

📝 풀이

백트래킹 문제입니다.
op배열에 순서대로 연산자의 갯수를 담아두고, 피연산자의 맨 처음값부터 인덱스를 올려가며 연산을 진행해줍니다. 연산자의 갯수를 방문배열처럼 활용하여, 1 이상일때 카운트값을 줄이고 재귀호출, 끝난 후에는 다시 카운트값을 1올려주어 다른 경우의 수에서도 다시 활용될 수 있도록 해줍니다. 모든 경우의 연산이 끝났을 때, 최솟값과 최댓값을 출력해주면 해결됩니다.

📜 후기

수학적 표현이 들어가서 첫인상은 복잡해 보였지만, 이해하고 나니 간단한 문제였던 것 같습니다.

profile
머무르지 않기!

0개의 댓글