ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2961번: 도영이가 만든 맛있는 음식
    PS/Java 2021. 3. 9.

    지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B를 알고 있다. 여러 재료를 이용해서 요리할 때, 그 음식의 신맛은 사용한 재료의 신맛의 곱이고, 쓴맛은 합이다.

     

    시거나 쓴 음식을 좋아하는 사람은 많지 않다. 도영이는 재료를 적절히 섞어서 요리의 신맛과 쓴맛의 차이를 작게 만들려고 한다. 또, 물을 요리라고 할 수는 없기 때문에, 재료는 적어도 하나 사용해야 한다.

     

    재료의 신맛과 쓴맛이 주어졌을 때, 신맛과 쓴맛의 차이가 가장 작은 요리를 만드는 프로그램을 작성하시오.


    import java.util.Scanner;
    
    public class Baekjoon2961 {
        public static class ingredient {
            int sweet;
            int bitter;
    
            ingredient(int bitter, int sweet) {
                super();
                this.bitter = bitter;
                this.sweet = sweet;
            }
        }
    
        public static ingredient[] ingredients;
        public static boolean[] selected;
        public static int n;
        public static int sumSweet;
        public static int sumBitter;
        public static int result;
        public static int min;
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            n = scanner.nextInt();
    
            ingredients = new ingredient[n];
            selected = new boolean[n];
    
            for(int i = 0; i < n; i++) {
                ingredients[i] = new ingredient(scanner.nextInt(), scanner.nextInt());
            }
    
            min = 987654321;
    
            mix(0);
            System.out.println(min);
        }
    
        public static void mix(int index) {
            if(index == n) {
                sumSweet = 0;
                sumBitter = 1;
                result = 0;
    
                for(int i = 0; i < n; i++) {
                    if(selected[i]) {
                        sumBitter *= ingredients[i].bitter;
                        sumSweet += ingredients[i].sweet;
                    }
                }
    
                if(sumSweet == 0) {
                    return;
                }
    
                result = Math.abs(sumBitter - sumSweet);
    
                if(result < min) {
                    min = result;
                }
                return;
            }
    
            selected[index] = true;
            mix(index + 1);
    
            selected[index] = false;
            mix(index + 1);
        }
    }
    

    [풀이]

    이 문제도 순열을 이용하여 푸는 문제이다.

     

    순열/조합 알고리즘은 자주 사용되니 알아두면 좋습니다.

    댓글

Designed by Tistory.