728x90

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.util.Scanner;

public class Main_BJ_14888_연산자끼워넣기 {
    static int[] operator = new int[4]; //+ - * /
    static int[] arr;
    static int n, max, min;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new int[n];
        for(int i=0; i<n; i++)
            arr[i] = sc.nextInt();
        for(int i=0; i<4; i++)
            operator[i] = sc.nextInt();

        max = Integer.MIN_VALUE;
        min = Integer.MAX_VALUE;
        result(arr[0], 1);
        System.out.println(max);
        System.out.println(min);


    }//main
    private static void result(int num, int idx){
        if(idx == n){
            max = Math.max(max, num);
            min = Math.min(min, num);
            return;
        }
        for(int i=0; i<4; i++){
            if(operator[i] >0){
                operator[i]--;
                switch (i){
                    case 0:
                        result(num+arr[idx], idx+1);
                        break;
                    case 1:
                        result(num-arr[idx], idx+1);
                        break;
                    case 2:
                        result(num*arr[idx], idx+1);
                        break;
                    case 3:
                        result(num/arr[idx], idx+1);
                        break;
                }
                operator[i]++;
            }
        }
    }//result
}

순열을 이용해서 다 뽑아도 된다!!

 

순열을 이용한다면...

import java.util.ArrayList;
import java.util.Scanner;

public class Main_BJ_14888_연산자끼워넣기2 {
    static int[] operator = new int[4]; //+ - * /
    static int[] arr, cal;
    static ArrayList<Integer> list = new ArrayList<>();
    static boolean[] visited;
    static int n, max, min;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new int[n];
        for(int i=0; i<n; i++)
            arr[i] = sc.nextInt();
        for(int i=0; i<4; i++) {
            operator[i] = sc.nextInt();
            while(operator[i]>0){
                list.add(i);
                operator[i]--;
            }

        }

        max = Integer.MIN_VALUE;
        min = Integer.MAX_VALUE;
        visited = new boolean[n-1];
        cal = new int[n-1];
        result( 0);

        System.out.println(max);
        System.out.println(min);


    }//main
    private static void result(int idx){
        if(idx == n-1){
            int num = calculate();

            max = Math.max(max, num);
            min = Math.min(min, num);
            return;
        }

        for(int i=0; i<n-1; i++){
            if(visited[i])
                continue;

            visited[i] = true;
            cal[idx] = list.get(i);
            result(idx+1);
            visited[i] = false;
        }
    }//result
    private static int calculate(){
        int num = arr[0];
        for(int i=0; i<n-1; i++){
            switch (cal[i]){
                case 0:
                    num += arr[i+1];
                    break;
                case 1:    // -
                    num -= arr[i+1];
                    break;
                case 2:    // *
                    num *= arr[i+1];
                    break;
                case 3:    // /
                    num /= arr[i+1];
                    break;
            }
        }
        return num;
    }//calculate
}

일단, scanner를 사용했으므로 조금 느리지만, 첫 번째 경우가 좀 더 적게 걸린다(당연할듯...)

 

 

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1427 소트인사이드(JAVA)  (0) 2023.05.09
백준 1010 다리 놓기(JAVA)  (0) 2023.05.08
백준 2156 포도주 시식(JAVA)  (4) 2023.05.03
백준 1018 체스판 다시 칠하기(JAVA)  (0) 2023.04.30
백준 13913 숨바꼭질 4(JAVA)  (0) 2023.04.28

+ Recent posts