-
[백준] 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); } }
[풀이]
이 문제도 순열을 이용하여 푸는 문제이다.
순열/조합 알고리즘은 자주 사용되니 알아두면 좋습니다.
'PS > Java' 카테고리의 다른 글
[백준] 17478번: 재귀함수가 뭔가요? (0) 2021.03.09 [백준] 1244번: 스위치 켜고 끄기 (0) 2021.03.09 [SWEA] 6808. 규영이와 인영이의 카드게임 (0) 2021.03.09 [백준] 2563번: 색종이 (0) 2021.03.09 [SWEA] 1954. 달팽이 숫자 (0) 2021.03.09