알고리즘/SW Expert Academy
[모의 SW 역량테스트] 요리사 -Java
dkwjdi
2021. 1. 5. 17:49
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
package SW_Expert_Academy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class 요리사 {
static int min, foodInfo[][], N;
static boolean check[];
public static void main(String[] args) throws NumberFormatException, IOException {
StringTokenizer st = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int tc=1; tc<=T; tc++) {
N=Integer.parseInt(br.readLine());
foodInfo=new int[N][N];
check=new boolean[N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
foodInfo[i][j]=Integer.parseInt(st.nextToken());
}
}
min=Integer.MAX_VALUE;
combination(0,0,N/2);
System.out.println("#"+tc+" "+min);
}
}
private static void combination(int cnt, int start, int end) {
if(cnt==end) {
int synergy=0;
List<Integer> foodA=new ArrayList<>();
List<Integer> foodB=new ArrayList<>();
for(int i=0; i<N; i++) {
if(check[i]) foodA.add(i);
else foodB.add(i);
}
min=Math.min(min, Math.abs(cal(foodA)-cal(foodB)));
return;
}
for(int i=start; i<N; i++) {
check[i]=true;
combination(cnt+1, i+1, end);
check[i]=false;
}
}
private static int cal(List<Integer> food) {
int sum=0;
int size=food.size();
for (int i = 0; i < size-1; i++) {
for(int j=i+1; j<size; j++) {
sum+=foodInfo[food.get(i)][food.get(j)];
sum+=foodInfo[food.get(j)][food.get(i)];
}
}
return sum;
}
}
소요시간 : 35분
조합만 쓸 줄 안다면 매우 쉬운 문제입니다.
주의하실 점은 만약 재료가 6개라면 (1,2,3,4,5,6)
1,2,3 4,5,6으로 나누었다고 치면
12 13 45 46
21 23 54 56
31 33 65 64
처럼 시너지를 구해야 한다는 점입니다!
우선 N/2를 depth로 해서 조합을 짭니다.
그렇게 해서 foodA, foodB를 만듭니다.
그리고 입력으로 주어진 시너지를 이용해서 값을 구해주면 끝입니다!!!