14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
[풀이]
1. N명 중 N/2명을 골라서 팀을 짠다.
- 조합
- 비트마스킹으로 구현했는데 그냥 배열로 해도 속도 차이 없을 것 같다.
2. 1번에서 만든 팀과 나머지 인원 팀의 능력치 합을 각각 구하고, 두 능력치의 차이를 구한다.
인풋으로 주어지는 2차원 배열 arr를 모두 탐색하면서 i,j가 팀에 속할 경우 arr[i][j] 값을 능력치 합에 더하면 된다.
3. 1~2번을 반복하여 두 팀의 능력치의 차이의 최소값을 구한다.
[소스코드]
import java.io.*;
import java.util.StringTokenizer;
public class Main{
static int n;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
String str=null;
StringTokenizer st=null;
n=Integer.parseInt(br.readLine());
arr=new int[n+1][n+1];
for(int i=1;i<=n;i++) {
str = br.readLine();
st = new StringTokenizer(str);
for (int j = 1; j <= n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
boolean[] chk=new boolean[n+1];
int result=game(chk,0,0,1);
bw.write(result+"");
bw.flush();
bw.close();
br.close();
}
public static int game(boolean[] chk, int bit, int cnt, int idx){
if(cnt==(n/2)){
int startScore=getScore(bit);
int linkScore=getScore(~bit);
return startScore>linkScore?(startScore-linkScore):(linkScore-startScore);
}
if(idx>n){
return Integer.MAX_VALUE;
}
int result=Integer.MAX_VALUE;
for(int i=idx;i<=n;i++){
if(chk[i]){
continue;
}
chk[i]=true;
int tbit=bit|(1<<i);
int tmpResult=game(chk,tbit,cnt+1,i+1);
result=Math.min(result,tmpResult);
chk[i]=false;
}
return result;
}
public static int getScore(int bit){
int sum=0;
for(int i=1;i<=n;i++){
if((bit&(1<<i))==0){
continue;
}
for(int j=1;j<=n;j++){
if((bit&(1<<j))>0){
sum+=arr[i][j];
}
}
}
return sum;
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 15686번 - 치킨 배달 (0) | 2021.04.19 |
---|---|
백준 1697번 - 숨바꼭질 (0) | 2021.04.18 |
백준 2636번 - 치즈 (0) | 2020.11.18 |
백준 16953번 - A→B (0) | 2020.11.17 |
백준 17070번 - 파이프 옮기기 1 (0) | 2020.11.17 |