본문 바로가기
카테고리 없음

백준 2961. 도영이가 만든 맛있는 음식

by 29살아저씨 2021. 8. 13.
반응형

🅰 백준 2961. 도영이가 만든 맛있는 음식

✏️ 문제 풀이

  • 부분집합을 이용하여 재료를 사용할 수 있는 모든 상황을 고려하였다.
  • LinkedList를 이용하여 {S,B}의 값을 넣어주었다.
  • isSelected 배열을 이용하여 부분집합을 생성하였고, 재료선택 케이스마다 sum,mul을 계산해주어 절대값을 이용하여 최소값을 계속 비교해주었다.

 

✏️ 소스코드

package com.ssafy.baekjoon;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main_S1_2961_손은성 {

	static LinkedList<int[]> ingre = new LinkedList<int[]>();
	static int N;
	static boolean isSelected[];
	static int min = Integer.MAX_VALUE;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		isSelected = new boolean[N];

		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int S = Integer.parseInt(st.nextToken());
			int B = Integer.parseInt(st.nextToken());
			ingre.add(new int[] { S, B });
		}
		subset(0);
		System.out.println(min);
	}

	// 부분집합 함수
	static void subset(int cnt) {
		int sum = 0;
		int mul = 1;
		int falseCnt = 0;
		if (cnt == N) {
			for (int i = 0; i < N; i++) {
				if (isSelected[i]) {
					mul *= ingre.get(i)[0];
					sum += ingre.get(i)[1];
				} else
					falseCnt++;
			}
			if (falseCnt != N) { // 공집합 일 때 계산 X
				min = Math.min(min, Math.abs(mul - sum));
			}

			return;
		}
		isSelected[cnt] = true;
		subset(cnt + 1);
		isSelected[cnt] = false;
		subset(cnt + 1);
	}
}

 

✅ 후기

  • 도영이 칼 일주일 압수.
반응형

댓글