๐ ๋ฌธ์
https://www.acmicpc.net/problem/14889
๋ฌธ์
์ค๋์ ์คํํธ๋งํฌ์ ๋ค๋๋ ์ฌ๋๋ค์ด ๋ชจ์ฌ์ ์ถ๊ตฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ถ๊ตฌ๋ ํ์ผ ์คํ์ ํ๊ณ ์๋ฌด ์ฐธ์๋ ์๋๋ค. ์ถ๊ตฌ๋ฅผ ํ๊ธฐ ์ํด ๋ชจ์ธ ์ฌ๋์ ์ด N๋ช ์ด๊ณ ์ ๊ธฐํ๊ฒ๋ N์ ์ง์์ด๋ค. ์ด์ N/2๋ช ์ผ๋ก ์ด๋ฃจ์ด์ง ์คํํธ ํ๊ณผ ๋งํฌ ํ์ผ๋ก ์ฌ๋๋ค์ ๋๋ ์ผ ํ๋ค.
BOJ๋ฅผ ์ด์ํ๋ ํ์ฌ ๋ต๊ฒ ์ฌ๋์๊ฒ ๋ฒํธ๋ฅผ 1๋ถํฐ N๊น์ง๋ก ๋ฐฐ์ ํ๊ณ , ์๋์ ๊ฐ์ ๋ฅ๋ ฅ์น๋ฅผ ์กฐ์ฌํ๋ค. ๋ฅ๋ ฅ์น Sij๋ i๋ฒ ์ฌ๋๊ณผ j๋ฒ ์ฌ๋์ด ๊ฐ์ ํ์ ์ํ์ ๋, ํ์ ๋ํด์ง๋ ๋ฅ๋ ฅ์น์ด๋ค. ํ์ ๋ฅ๋ ฅ์น๋ ํ์ ์ํ ๋ชจ๋ ์์ ๋ฅ๋ ฅ์น Sij์ ํฉ์ด๋ค. Sij๋ Sji์ ๋ค๋ฅผ ์๋ ์์ผ๋ฉฐ, i๋ฒ ์ฌ๋๊ณผ j๋ฒ ์ฌ๋์ด ๊ฐ์ ํ์ ์ํ์ ๋, ํ์ ๋ํด์ง๋ ๋ฅ๋ ฅ์น๋ Sij์ Sji์ด๋ค.
N=4์ด๊ณ , S๊ฐ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
i\j12341234
1 | 2 | 3 | |
4 | 5 | 6 | |
7 | 1 | 2 | |
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๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์คํํธ ํ๊ณผ ๋งํฌ ํ์ ๋ฅ๋ ฅ์น์ ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
์ฌ๋๋ผ๋ฆฌ์ ์๋์ง๋ ์ธ์ ํ๋ ฌ์ ์ผ๊ณ (์ค๋ฒ3์ด๋ผ ์ธ์ ๋ฆฌ์คํธ๊น์ง ํ์์์ ๋ฏํ๋ค), ํ์ ์ ํ๋ ๋ถ๋ถ์ ์กฐํฉ์ผ๋ก ํ์๋ค.
๐ก boolean ํ์ ์ select ๋ณ์๋ ์คํํธํ๊ณผ ๋งํฌํ์ ๊ตฌ๋ถํ๋ ๋ณ์๋ก ์ฌ์ฉ๋๋ค.
์คํํธ ํ์์ด true๊ฐ์, ๋งํฌ ํ์์ด false๊ฐ์ ๊ฐ๋๋ค๊ณ ์ดํดํ๋ฉด ์ฝ๋ค.
โ๏ธ ์กฐํฉ์ฝ๋๋ก ์ ๋ฐ์ ๋ฝ๋๋ค.
โ๏ธ ์์ ํ์์ผ๋ก ์คํํธ ํ์๋ผ๋ฆฌ/๋งํฌ ํ์๋ผ๋ฆฌ๋ฅผ ์ฐพ์ ์๋์ง๋ฅผ ํฉํ๋ค.
์ด๋ ์ด๋ฏธ A->B๋ฅผ ์ฐพ์ ๋์ ์๋์ง๋ฅผ ๋ํ๋๋ฐ, B->A๋ฅผ ์ฐพ์ ์ด์ค์ผ๋ก ๊ณ์ฐํ๋ ์ผ์ด ์ผ์ด๋์ง ์๋๋ก ์ผ๋ฐฉํฅ์ฑ์ ์งํจ๋ค.
โ๏ธ ์๋ก ๊ตฌํ ํ ์๋์ง์ ์ฐจ์ ํ์ฌ๊น์ง์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ์ฌ ์ต์๊ฐ์ ์ ๋ฐ์ดํธํ๋ค.
โ๏ธ ์ค๊ฐ์ 0์ด๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด, ๊ตฌํ ์ ์๋ ๊ฐ์ฅ ์์ ๊ฐ์ด ๋์จ ๊ฒ์ด๋ฏ๋ก ํ์์ ์ข ๋ฃํ๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_๋ฐฑ์ค_14889_์คํํธ์๋งํฌ_์ค๋ฒ3 {
static int N, result = Integer.MAX_VALUE;
static int[][] person;
static boolean[] select;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
person = new int[N][N];
select = new boolean[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
person[i][j] = Integer.parseInt(st.nextToken());
}
}//input
combination(0,0);
System.out.println(result);
}//end of main
static void combination(int cnt, int start) {
if(cnt==N/2) { //selection complete
int teamStart = 0, teamLink = 0;
for (int i = 0; i < N; i++) {
for (int j = i+1; j < N; j++) {
if(select[i]==true && select[j]==true) {
teamStart += person[i][j];
teamStart += person[j][i];
}
if(select[i]==false && select[j]==false) {
teamLink += person[i][j];
teamLink += person[j][i];
}
}
}//synergy addition
int diff = Math.abs(teamStart-teamLink);
result = Math.min(result, diff);
if(result==0) { //best ideal value
System.out.println(0);
System.exit(0);
}
return;
}
for (int i = start; i < N; i++) {
select[i] = true;
combination(cnt+1, i+1);
select[i] = false;
}//combination
}//end of combination
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ