728x90
https://www.acmicpc.net/problem/14889
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
DFS 조합을 이용해서 풀면 되는 문제.
visit 체크를 해서 푸는 점이 새로웠다. 생각보다 비효율적인 것 같은데도 시간초과가 안나더라..
다른 블로그를 참고해서 풀었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
static int[][] map;
static boolean[] visit;
static int MIN = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N]; //가로 세로 0 ~ N-1
visit = new boolean[N];
for(int i = 0; i < N; i ++) {
String[] tmp = br.readLine().split(" ");
for(int j = 0; j < N; j ++) {
map[i][j] = Integer.parseInt(tmp[j]);
}
}
dfs(0, 0);
System.out.println(MIN);
}
public static void dfs(int at, int dep) {
if(dep == N/2) {
dif();
return;
}
for(int i = at; i < N; i ++) {
if(!visit[i]) {
visit[i] = true;
dfs(i + 1, dep + 1);
visit[i] = false;
}
}
}
private static void dif() {
int start = 0;
int link = 0;
for(int i = 0; i < N - 1; i ++) {
for(int j = i + 1; j < N; j ++) {
if(visit[i] && visit[j]) {
start += map[i][j] + map[j][i];
}
if(!visit[i] && !visit[j]) {
link += map[i][j] + map[j][i];
}
}
}
int diff = Math.abs(start - link);
if(diff == 0) {
System.out.println(0);
System.exit(0);
}
MIN = Math.min(MIN, diff);
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 17144 미세먼지 안녕 자바 풀이 (0) | 2022.04.21 |
|---|---|
| 백준 16236 아기 상어 자바 풀이 (0) | 2022.04.20 |
| 백준 13549 자바 풀이 (0) | 2022.03.26 |
| 백준 12851 자바 풀이 (0) | 2022.03.22 |
| 백준 16953 자바 풀이 (0) | 2022.03.11 |