[Silver II] ์คํํธ์ ๋งํฌ - 14889
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 21512 KB, ์๊ฐ: 464 ms
๋ถ๋ฅ
๋ฐฑํธ๋ํน, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ ์ค๋ช
์ค๋์ ์คํํธ๋งํฌ์ ๋ค๋๋ ์ฌ๋๋ค์ด ๋ชจ์ฌ์ ์ถ๊ตฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ถ๊ตฌ๋ ํ์ผ ์คํ์ ํ๊ณ ์๋ฌด ์ฐธ์๋ ์๋๋ค. ์ถ๊ตฌ๋ฅผ ํ๊ธฐ ์ํด ๋ชจ์ธ ์ฌ๋์ ์ด N๋ช ์ด๊ณ ์ ๊ธฐํ๊ฒ๋ N์ ์ง์์ด๋ค. ์ด์ N/2๋ช ์ผ๋ก ์ด๋ฃจ์ด์ง ์คํํธ ํ๊ณผ ๋งํฌ ํ์ผ๋ก ์ฌ๋๋ค์ ๋๋ ์ผ ํ๋ค.
BOJ๋ฅผ ์ด์ํ๋ ํ์ฌ ๋ต๊ฒ ์ฌ๋์๊ฒ ๋ฒํธ๋ฅผ 1๋ถํฐ N๊น์ง๋ก ๋ฐฐ์ ํ๊ณ , ์๋์ ๊ฐ์ ๋ฅ๋ ฅ์น๋ฅผ ์กฐ์ฌํ๋ค. ๋ฅ๋ ฅ์น Sij๋ i๋ฒ ์ฌ๋๊ณผ j๋ฒ ์ฌ๋์ด ๊ฐ์ ํ์ ์ํ์ ๋, ํ์ ๋ํด์ง๋ ๋ฅ๋ ฅ์น์ด๋ค. ํ์ ๋ฅ๋ ฅ์น๋ ํ์ ์ํ ๋ชจ๋ ์์ ๋ฅ๋ ฅ์น Sij์ ํฉ์ด๋ค. Sij๋ Sji์ ๋ค๋ฅผ ์๋ ์์ผ๋ฉฐ, i๋ฒ ์ฌ๋๊ณผ j๋ฒ ์ฌ๋์ด ๊ฐ์ ํ์ ์ํ์ ๋, ํ์ ๋ํด์ง๋ ๋ฅ๋ ฅ์น๋ Sij์ Sji์ด๋ค.
N=4์ด๊ณ , S๊ฐ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
i\j | 1 | 2 | 3 | 4 |
---|---|---|---|---|
1 | 1 | 2 | 3 | |
2 | 4 | 5 | 6 | |
3 | 7 | 1 | 2 | |
4 | 3 | 4 | 5 |
์๋ฅผ ๋ค์ด, 1, 2๋ฒ์ด ์คํํธ ํ, 3, 4๋ฒ์ด ๋งํฌ ํ์ ์ํ ๊ฒฝ์ฐ์ ๋ ํ์ ๋ฅ๋ ฅ์น๋ ์๋์ ๊ฐ๋ค.
- ์คํํธ ํ: S12 + S21 = 1 + 4 = 5
- ๋งํฌ ํ: S34 + S43 = 2 + 5 = 7
1, 3๋ฒ์ด ์คํํธ ํ, 2, 4๋ฒ์ด ๋งํฌ ํ์ ์ํ๋ฉด, ๋ ํ์ ๋ฅ๋ ฅ์น๋ ์๋์ ๊ฐ๋ค.
- ์คํํธ ํ: S13 + S31 = 2 + 7 = 9
- ๋งํฌ ํ: S24 + S42 = 6 + 4 = 10
์ถ๊ตฌ๋ฅผ ์ฌ๋ฏธ์๊ฒ ํ๊ธฐ ์ํด์ ์คํํธ ํ์ ๋ฅ๋ ฅ์น์ ๋งํฌ ํ์ ๋ฅ๋ ฅ์น์ ์ฐจ์ด๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค. ์์ ์์ ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ 1, 4๋ฒ์ด ์คํํธ ํ, 2, 3๋ฒ ํ์ด ๋งํฌ ํ์ ์ํ๋ฉด ์คํํธ ํ์ ๋ฅ๋ ฅ์น๋ 6, ๋งํฌ ํ์ ๋ฅ๋ ฅ์น๋ 6์ด ๋์ด์ ์ฐจ์ด๊ฐ 0์ด ๋๊ณ ์ด ๊ฐ์ด ์ต์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(4 โค N โค 20, N์ ์ง์)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ S๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ค์ N๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , i๋ฒ ์ค์ j๋ฒ์งธ ์๋ Sij ์ด๋ค. Sii๋ ํญ์ 0์ด๊ณ , ๋๋จธ์ง Sij๋ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์คํํธ ํ๊ณผ ๋งํฌ ํ์ ๋ฅ๋ ฅ์น์ ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
import java.util.*;
public class Main {
static int n;
static int[][] ability;
static boolean[] visited;
static int minDiff = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
ability = new int[n][n];
visited = new boolean[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ability[i][j] = sc.nextInt();
}
}
dfs(0, 0); // ๊น์ด ์ฐ์ ํ์ ์์
System.out.println(minDiff);
}
public static void dfs(int index, int depth) { // index: ํ์ฌ ์ ํํ ์ ์๋ ์ ์์ ์ธ๋ฑ์ค, depth: ํ์ฌ๊น์ง ์ ํํ ์ ์์ ์
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 (visited[i] && visited[j]) {
startTeam += ability[i][j] + ability[j][i]; // ์คํํธ ํ์ ๋ฅ๋ ฅ์น
} else if (!visited[i] && !visited[j]) {
linkTeam += ability[i][j] + ability[j][i]; // ๋งํฌ ํ์ ๋ฅ๋ ฅ์น
}
}
}
int diff = Math.abs(startTeam - linkTeam); // ๋ฅ๋ ฅ์น ์ฐจ์ด์ ์ ๋๊ฐ์ ๊ณ์ฐ
if (diff == 0) { // 0์ด๋ฉด ๋ฐ๋ก ์ถ๋ ฅ
System.out.println(diff);
System.exit(0);
}
minDiff = Math.min(diff, minDiff); // ๋ฅ๋ ฅ์น ์ฐจ์ด์ ์ต์๊ฐ
return;
}
for (int i = index; i < n; i++) {
if (!visited[i]) {
visited[i] = true;
dfs(i + 1, depth + 1);
visited[i] = false; // ์ฌ๊ท ํธ์ถ์ด ๋๋๋ฉด ์ ํํ ์ ์๋ฅผ ์ด์ ์ํ๋ก ๋๋ฆฌ๊ธฐ ์ํด false๋ก ๋ณ๊ฒฝ
}
}
}
}