https://www.acmicpc.net/problem/14889
[난이도]
- Silver 1
[알고리즘]
- DFS
- 완전탐색
- 백트래킹
[코드]
import java.io.*;
import java.util.*;
public class Main {
static int N, answer = Integer.MAX_VALUE;
static int[][] players;
static boolean[] selected;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
players = new int[N][N];
selected = new boolean[N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
players[i][j] = Integer.parseInt(st.nextToken());
}
}
solve(0, 0);
System.out.println(answer);
br.close();
}
static void solve(int depth, int index) {
if (depth == N/2) {
int startTeam = 0;
int linkTeam = 0;
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if (selected[i] && selected[j]) {
startTeam += players[i][j];
startTeam += players[j][i];
} else if (!selected[i] && !selected[j]) {
linkTeam += players[i][j];
linkTeam += players[j][i];
}
}
}
int diff = Math.abs(startTeam - linkTeam);
answer = Math.min(answer, diff);
return;
}
for (int i = index; i < N; i++) {
if (!selected[i]) {
selected[i] = true;
solve(depth + 1, i + 1);
selected[i] = false;
}
}
}
}
[풀이]
boolean 배열로 선택한 선수와 선택하지 않은선수를 나눠계산한다.
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if (selected[i] && selected[j]) {
startTeam += players[i][j];
startTeam += players[j][i];
} else if (!selected[i] && !selected[j]) {
linkTeam += players[i][j];
linkTeam += players[j][i];
}
}
}
solve의 매개변수로 depth와 index를 주었다.
for (int i = index; i < N; i++) {
if (!selected[i]) {
selected[i] = true;
solve(depth + 1, i + 1);
selected[i] = false;
}
}
for문을 돌며 선수를 선택할 때 i를 index로주고 선수를 선택했다면 매개변수를 건네줄때 i + 1로 주어 중복탐색을 줄여 시간초과를 방지할 수 있다.
'코딩테스트' 카테고리의 다른 글
프로그래머스 159993: 미로 탈출 [JAVA] (1) | 2024.05.12 |
---|---|
프로그래머스 169199 : 리코쳇 로봇 [JAVA] (0) | 2024.05.11 |
백준 2961: 도영이가 만든 맛있는 음식 [JAVA] (0) | 2024.05.09 |
백준 10971: 외판원 순회 2 [JAVA] (0) | 2024.05.08 |
백준 6603: 로또 [JAVA] (0) | 2024.05.08 |