개발 무지렁이

[문제풀이] B2961 도영이가 만든 맛있는 음식 본문

코딩 테스트/문제풀이

[문제풀이] B2961 도영이가 만든 맛있는 음식

Gaejirang-e 2023. 3. 27. 20:43

도영이가 만든 맛있는 음식


  🪅 재료를 사용하고 말고의 문제를 부분집합으로 해석할 수 있는가 => 포함하는가 or 아닌가
  🪅 부분집합을 구현할 수 있는가

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

/**
 * 백준 2961번 도영이가 만든 맛있는 음식
 * 입력:
 * 첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 
 * 모든 재료를 사용해서 요리를 만들었을 때, 그 요리의 신맛과 쓴맛은 모두 1,000,000,000보다 작은 양의 정수이다. 
 *
 * 출력:
 * 첫째 줄에 신맛과 쓴맛의 차이가 가장 작은 요리의 차이를 출력한다. 
 */
public class Main {
    static int[][] arr2d;
    static int N;
    static boolean[] isSelected;
    static boolean isCheck;
    static List<Integer> list = new ArrayList<>();
    public static void subset(int num) {
        // 종료조건
        if(num == N) {
            int sourPro = 1;
            int bitterSum = 0;
            for(int i = 0; i < N; i++) {
                if(isSelected[i]) {
                    isCheck = true;
                    sourPro *= arr2d[i][0];
                    bitterSum += arr2d[i][1];
                }
            }

            if(!isCheck) {
                return;
            }

            list.add(Math.abs(sourPro-bitterSum));
            return;
        }

        // 재귀적 확장
        isSelected[num] = false;
        subset(num+1);

        isSelected[num] = true;
        subset(num+1);
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr2d = new int[N][2];
        isSelected = new boolean[N];

        // 재료의 개수 N만큼 신맛과 쓴맛을 입력
        for(int i = 0; i < N; i++) {
            StringTokenizer token = new StringTokenizer(br.readLine(), " ");
            arr2d[i][0] = Integer.parseInt(token.nextToken()); // 신맛, *
            arr2d[i][1] = Integer.parseInt(token.nextToken()); // 쓴맛, +
        }

        subset(0);

        Collections.sort(list);

        System.out.println(list.get(0));
    }
}

💡 문제 접근 과정
결국 재료를 포함시킬 것인가, 아닌것인가의 문제이다.
요소를 포함시키고 말고의 문제는 완전탐색 중 부분집합으로 풀면 되겠다고 생각했다.
각각의 결과를 List에 넣고, 오름차순으로 정렬한 다음 가장 앞에있는 요소를 출력하는 방식으로 문제를 해결했다.

'코딩 테스트 > 문제풀이' 카테고리의 다른 글

[문제풀이] B1068 트리  (0) 2023.04.02
[문제풀이] B9742 순열  (0) 2023.03.27
[문제풀이] B1759 암호만들기  (0) 2023.03.27
[문제풀이] B15650 N과M (2)  (0) 2023.03.25
[문제풀이] B2018 수들의 합 5  (0) 2023.03.25
Comments