본문 바로가기
JAVA

백준 15658 JAVA

by Son 2023. 11. 30.

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

 

15658번: 연산자 끼워넣기 (2)

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대

www.acmicpc.net

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


public class Main {
    static int n;  //첫째줄 수열의 개수
    static int[] nums;  //수열을 담을 배열 nums
    static int[] operator; //수식을 담을 배열 operator
    static int result_min = Integer.MAX_VALUE;  //최대값
    static int result_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());  //첫째줄 수열의 개수
        nums = new int[n];  //수열을 담을 배열 nums

        StringTokenizer st = new StringTokenizer(br.readLine()); //두번째 줄 
        for(int i=0; i<n; i++){
            nums[i] = Integer.parseInt(st.nextToken());  // 수열 분리후 nums 배열에 저장
        }

        operator = new int[4];  // 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수를 담을 배열 operator
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<4; i++){
            operator[i] = Integer.parseInt(st.nextToken());
        }
        
        dfs(1, nums[0]);  

        System.out.println(result_max);
        System.out.println(result_min);
    }

    public static void dfs(int idx, int sum){
        if(idx==n){  //깊이가 수열의 개수와 갔다면
            result_min = Math.min(result_min, sum);  //최대값
            result_max = Math.max(result_max, sum); //최소값
            return;
        }

        for(int i=0; i<4; i++){
            if(operator[i] == 0) continue;  //사용할 수 있는 수식이 없는 경우 continue
            operator[i]--; //수식개수 하나 제거 
            switch (i){  //순서 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수
                case 0:
                    dfs(idx + 1, sum + nums[idx]);  //깊이+1 추가 
                    break;
                case 1:
                    dfs(idx + 1, sum - nums[idx]);
                    break;
                case 2:
                    dfs(idx + 1, sum * nums[idx]);
                    break;
                case 3:
                    dfs(idx + 1, sum / nums[idx]);
                    break;
            }
            operator[i]++;  //수식을 사용하고 나서는 수식 개수를 원상복귀 시켜야됨
        }


    }

}

\

 

'JAVA' 카테고리의 다른 글

백준 14500 JAVA  (0) 2023.12.19
[백준] 15658 JAVA  (2) 2023.12.02
백준 14888 JAVA  (2) 2023.10.15
백준 1339번 JAVA  (3) 2023.10.11
정보처리기사 실기 2022년 2회  (2) 2023.09.19