[BOJ][๐ก5][๋ฐฑ์ค#15661] ๋งํฌ์ ์คํํธ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ค๋์ ์คํํธ๋งํฌ์ ๋ค๋๋ ์ฌ๋๋ค์ด ๋ชจ์ฌ์ย ์ถ๊ตฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ถ๊ตฌ๋ ํ์ผ ์คํ์ ํ๊ณ ย ์๋ฌด ์ฐธ์๋ ์๋๋ค. ์ถ๊ตฌ๋ฅผ ํ๊ธฐ ์ํด ๋ชจ์ธ ์ฌ๋์ ์ด N๋ช ์ด๋ค. ์ด์ ์คํํธ ํ๊ณผ ๋งํฌ ํ์ผ๋ก ์ฌ๋๋ค์ ๋๋ ์ผ ํ๋ค. ๋ ํ์ ์ธ์์๋ ๊ฐ์ง ์์๋ ๋์ง๋ง, ํ ๋ช ์ด์์ด์ด์ผ ํ๋ค. 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๊ฐ์ ์ค์ S๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ค์ N๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , i๋ฒ ์ค์ j๋ฒ์งธ ์๋ Sij ์ด๋ค. Sii๋ ํญ์ 0์ด๊ณ , ๋๋จธ์ง Sij๋ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์คํํธ ํ๊ณผ ๋งํฌ ํ์ ๋ฅ๋ ฅ์น์ ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
4
0 1 2 3
4 0 5 6
7 1 0 2
3 4 5 0
์ถ๋ ฅ
0
์์ 2
์ ๋ ฅ
6
0 1 2 3 4 5
1 0 2 3 4 5
1 2 0 3 4 5
1 2 3 0 4 5
1 2 3 4 0 5
1 2 3 4 5 0
์ถ๋ ฅ
2
์์ 3
์ ๋ ฅ
8
0 5 4 5 4 5 4 5
4 0 5 1 2 3 4 5
9 8 0 1 2 3 1 2
9 9 9 0 9 9 9 9
1 1 1 1 0 1 1 1
8 7 6 5 4 0 3 2
9 1 9 1 9 1 0 9
6 5 4 3 2 1 9 0
์ถ๋ ฅ
1
์์ 4
์ ๋ ฅ
5
0 3 1 1 1
3 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
์ถ๋ ฅ
0
My Sol
import sys
from itertools import combinations
def calc_score(S):
global mat
ret = 0
for i, j in combinations(S, 2):
ret += mat[i][j]+mat[j][i]
return ret
ans = 1e5
N = int(input())
S = set(range(N))
mat = [list(map(int, input().split())) for _ in range(N)]
for cnt in range(1, N//2+1):
for comb in combinations(list(range(N)), cnt):
C = set(comb)
a = calc_score(C)
b = calc_score(S-C)
ret = abs(a-b)
if ans > ret:
ans = ret
if not ans: break
print(ans)
๋ฌธ์ ํ์ด์ ๊ด๊ฑด์ ๊ฐ ํ์ ์ธ์์ด ๋ค๋ฅผ ์ ์๋ค๋ ์ ์ด๋ค. ์ต์ 1๋ช ์ ํ์๋ง ์์ผ๋ฉด ๋๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค.
- 1๋ถํฐ N//2๊น์ง์ ์ธ์์์ ๋ชจ๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ ์กฐํฉ๊ณผ ๊ทธ์ ๋ฐ๋๋๋ ์กฐํฉ์ ์๋์ง ์ ์๋ฅผ ๊ตฌํด์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ค.
- ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ