일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CS
- 스포티파이
- Gem
- c
- spotify
- 파이썬
- Spotify Api
- python
- SECS
- Spring JPA
- java
- 프로그래머스
- programmers
- Computer Science
- SWEA
- 백준
- MYSQL
- regression
- Baekjoon
- spring boot
- 회귀
- SECS/GEM
- modern c++
- 자바
- SW Expert Academy
- linux
- 회원가입
- SECS-II
- Spring
- C++
- Today
- Total
비버놀로지
[BAEKJOON 백준] 2961 도영이가 만든 맛있는 음식 본문
문제
도영이는 짜파구리 요리사로 명성을 날렸었다. 이번에는 이전에 없었던 새로운 요리에 도전을 해보려고 한다.
지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B를 알고 있다. 여러 재료를 이용해서 요리할 때, 그 음식의 신맛은 사용한 재료의 신맛의 곱이고, 쓴맛은 합이다.
시거나 쓴 음식을 좋아하는 사람은 많지 않다. 도영이는 재료를 적절히 섞어서 요리의 신맛과 쓴맛의 차이를 작게 만들려고 한다. 또, 물을 요리라고 할 수는 없기 때문에, 재료는 적어도 하나 사용해야 한다.
재료의 신맛과 쓴맛이 주어졌을 때, 신맛과 쓴맛의 차이가 가장 작은 요리를 만드는 프로그램을 작성하시오.
입력
첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 모든 재료를 사용해서 요리를 만들었을 때, 그 요리의 신맛과 쓴맛은 모두 1,000,000,000보다 작은 양의 정수이다.
출력
첫째 줄에 신맛과 쓴맛의 차이가 가장 작은 요리의 차이를 출력한다.
DFS 중에 subset을 이용해 문제를 풀었다.
신맛과 쓴맛을 저장해줄 Food 클래스를 만들어 준다.
그리고 입력을 받아 LinkedList에 값들을 저장해 준다.
적어도 하나 이상을 섞어야 하므로, 한개일때, 두개일때, 세개일때 네개일때 ... 모두 찾아 비교를 해봐야 한다.
isSelected 라는 boolean 배열을 하나 만들어서 어떤 것을 섞을 지를 표현해 주고, true가 된 것들을 섞어 준다.
그렇게 섞인 신맛과 쓴맛을 비교를 해서 result값에 넣어 주는데 그 때 result보다 값이 적을 때만 넣어준다.
그렇게 탐색이 끝이 나면 result 값을 출력해 준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static LinkedList <Integer> que=new LinkedList<>();
static int S,B,N;
static boolean isSelected[];
static Food food[];
static class Food{
int S,B;
public Food(int s, int b) {
super();
S = s;
B = b;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(bf.readLine()," ");
N=Integer.parseInt(st.nextToken());
food= new Food[N];
isSelected=new boolean[N];
for(int i=0;i<N;i++) {
st=new StringTokenizer(bf.readLine()," ");
S=Integer.parseInt(st.nextToken());
B=Integer.parseInt(st.nextToken());
food[i]=new Food(S,B);
}
subset(0);
int result=999999999;
while(!que.isEmpty()) {
int temp=que.poll();
if(result>temp) {
result=temp;
}
}
System.out.println(result);
}
static void subset(int cnt) {
if(cnt==N) {
int ST=1;
int BT=0;
for(int i=0;i<N;i++) {
if(isSelected[i]) {
ST*=food[i].S;
BT+=food[i].B;
}else continue;
}
if(BT!=0)
que.offer(Math.abs(ST-BT));
return;
}
isSelected[cnt]=true;
subset(cnt+1);
isSelected[cnt]=false;
subset(cnt+1);
}
}
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 3046 R2 (0) | 2021.02.28 |
---|---|
[BAEKJOON 백준] 3003 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2021.02.27 |
[BAEKJOON 백준] 2914 저작권 (0) | 2021.02.27 |
[BAEKJOON 백준] 2845 파티가 끝나고 난 뒤 (0) | 2021.02.27 |
[BAEKJOON 백준] 2669 직사각형 네개의 합집합의 면적 구하기 (0) | 2021.02.26 |