์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- upperbound
- ์๋ฃ๊ตฌ์กฐ
- Django
- ์์ด
- ์กฐํฉ
- ๋ค์ต์คํธ๋ผ
- ์ด๋ถํ์
- ํ์๊ฐ์
- ์๋ฎฌ๋ ์ด์
- ๋นํธ๋ง์คํน
- ์ฌ๊ท
- ํ๋ก์ด๋์์
- ํฌํฌ์ธํฐ
- ๊ทธ๋ฆฌ๋
- Union Find
- PriorityQueue
- dp
- ๋ฐฑํธ๋ํน
- ์นด์นด์ค
- ํธ๋ผ์ด
- ๋ถ๋ถ์งํฉ
- BFS
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- Dijkstra
- ๊ตฌํ
- ์ด์งํธ๋ฆฌ
- ์ฐ์ ์์ํ
- Floyd
- dfs
- LowerBound
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 14889 ์คํํธ์ ๋งํฌ ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 14889 ์คํํธ์ ๋งํฌ
snowball๐ฐ 2023. 1. 29. 00:37https://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
๋ฌธ์
์ค๋์ ์คํํธ๋งํฌ์ ๋ค๋๋ ์ฌ๋๋ค์ด ๋ชจ์ฌ์ ์ถ๊ตฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ถ๊ตฌ๋ ํ์ผ ์คํ์ ํ๊ณ ์๋ฌด ์ฐธ์๋ ์๋๋ค. ์ถ๊ตฌ๋ฅผ ํ๊ธฐ ์ํด ๋ชจ์ธ ์ฌ๋์ ์ด 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.io.*;
import java.util.*;
public class BOJ_14889 {
static int half;
static int N;
static int[] team;
static int[][] power;
static int result;
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken());
power = new int[N][N]; // ๋ฅ๋ ฅ์น๋ฅผ ๋ด์ ๋ณ์
team = new int[N]; // 0, 1์ ๊ฐ๋ง ๊ฐ๊ณ ๊ฐ์ ์ซ์๋ฅผ ๊ฐ์ง i+1๋ฒ์ ๊ฐ์ ํ์ด๋ค.
half = N / 2;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < N; j++)
power[i][j] = Integer.parseInt(st.nextToken());
}
result = Integer.MAX_VALUE; // ์ต์๊ฐ์ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ต๋๊ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ์ด์ค๋ค.
dfs(0, 0);
sb.append(result);
System.out.println(sb.toString());
}
static void dfs(int member, int x) {
if (member == half) { // ๋ฉค๋ฒ๊ฐ ๋ฐ์ผ๋ก ๋๋์ด์ก์ผ๋ฏ๋ก ๋ฅ๋ ฅ์น๋ฅผ ๊ณ์ฐํด์ค๋ค.
int score1 = 0, score2 = 0; // ๊ฐ ํ์ ์ ์๋ฅผ ์ ์ฅํ ๋ณ์๋ก 0์ผ๋ก ์ด๊ธฐํ ํ๋ค.
for (int k = 0; k < N; k++) {
for (int u = k + 1; u < N; u++) { // u๋ 0์์ ์์ํ๊ฒ ๋๋ฉด ๊ฐ์ ์ ์๋ฅผ ๋๋ฒ ๋ํ๊ฒ ๋๋ค.
if (team[k] == 0 && team[u] == 0)
score2 += power[k][u] + power[u][k];
if (team[k] == 1 && team[u] == 1)
score1 += power[k][u] + power[u][k];
}
}
if (Math.abs(score1 - score2) < result) // ์ ๋๊ฐ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฒฝ์ฐ ๊ฐฑ์ ํ๋ค.
result = Math.abs(score1 - score2);
return;
}
for (int i = x + 1; i < N; i++) { // ์๋๋ x์์ ์์ํด์ผ ํ์ง๋ง ์ด ๋ฌธ์ ๋ ๋ถํ ๋ฌธ์ ์ด๋ฏ๋ก ํ์ ์ซ์๊ฐ ์ค์ํ์ง ์์ +1์์ ์์ํด๋ ๋๋ค.
team[i] = 1;
dfs(member + 1, i);
team[i] = 0;
}
}
}
ํ์ค์ฉ ์ค๋ช ํด๋ณด์!
static int half;
static int N;
static int[] team;
static int[][] power;
static int result;
half๋ N์ ์ ๋ฐ ๊ฐ์ ์ ์ฅํ๊ณ ์๋ค.
team ๋ฐฐ์ด์ ํตํด ๊ฐ์ ํ์ธ ๊ฒฝ์ฐ ๊ฐ์ ์๋ฅผ ์ ์ฅํ๋๋ก ํ์๋ค.
power ๋ฐฐ์ด์ ์ฃผ์ด์ง ๋ฅ๋ ฅ์น์ ๊ฐ์ด ๋ด๊ฒจ์๋ค.
static void dfs(int member, int x) {
if (member == half) {
int score1 = 0, score2 = 0;
for (int k = 0; k < N; k++) {
for (int u = k + 1; u < N; u++) {
if (team[k] == 0 && team[u] == 0)
score2 += power[k][u] + power[u][k];
if (team[k] == 1 && team[u] == 1)
score1 += power[k][u] + power[u][k];
}
}
dfs ๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ํจ์๋ฅผ ์ ์ธํด์ฃผ์๋ค.
member๋ 1๋ฒ ํ์ ์ํ ๋ฉค๋ฒ์ ์์ด๋ค. ์ด์์ ์ ๋ฐ์ด 1๋ฒ ํ์ด ๋์๋ค๋ฉด ํ ๊ตฌ์ฑ์ด ๋ชจ๋ ์ข ๋ฃ๋์์ผ๋ฏ๋ก ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
์ด์ค loop๋ฅผ ํตํด N๋ช ์ ์กฐ์ฌํ๋ค. ์ด๋ 2๋ฒ ๊ณ์ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ loop๋ k+1๋ถํฐ ์์ํ๋ค. k์ u์ ํ์ด ๊ฐ์ผ๋ฉด ๊ฐ score ๋ณ์์ ๋ฅ๋ ฅ์น๋ฅผ ๊ณ์ฐํ์ฌ ๋ํด์ค๋ค.
if (Math.abs(score1 - score2) < result)
result = Math.abs(score1 - score2);
return;
๋ ๋ฅ๋ ฅ์น ๊ณ์ฐ ๊ฐ์ ์ฐจ๊ฐ ๊ฒฐ๊ณผ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ๊ฐฑ์ ํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๊ธฐ ์ํด return ํด์ค๋ค.
for (int i = x + 1; i < N; i++) {
team[i] = 1;
dfs(member + 1, i);
team[i] = 0;
}
for๋ฌธ์ x+1๋ถํฐ ์์ํ๋ ์ด์ ๋ 0๋ฒ ๋ฉค๋ฒ๊ฐ 0ํ๊ณผ 1ํ ์ค ์ด๋์ ์ํ๋ ๊ฒ์ด ์ค์ํ์ง ์๊ณ ํ์ ๋ฉค๋ฒ๊ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
0๋ฒ ๋ฉค๋ฒ๋ 0ํ์ผ๋ก ๊ณ ์ ๋๊ฒ ์ง๋ง ๋๋จธ์ง ๋ฉค๋ฒ๋ค์ ์ด๋ ํ์๋ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ์กฐ์ฌํ ์ ์๋ค.
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 15686 ์นํจ ๊ฑฐ๋ฆฌ (0) | 2023.01.29 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 15683 ๊ฐ์ (0) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14891 ํฑ๋๋ฐํด (1) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14503 ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2023.01.28 |
[JAVA] BOJ ๋ฐฑ์ค 14502๋ฒ ์ฐ๊ตฌ์ (1) | 2023.01.27 |