[BOJ][๐ก4][๋ฐฑ์ค#17471] ๊ฒ๋ฆฌ๋งจ๋๋ง
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋ฐฑ์ค์์ ์์ฅ ์ต๋ฐฑ์ค์ ์ง๋ ๋ช ๋ ๊ฐ ๊ฒ๋ฆฌ๋งจ๋๋ง์ ํตํด์ ์์ ์ ๋น์๊ฒ ์ ๋ฆฌํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ํ์ ํ๋ค. ๊ฒฌ์ ํ ๊ถ๋ ฅ์ด ์์ด์ง ์ต๋ฐฑ์ค์ย ๊ถ๋ ฅ์ ๋งค์ฐ ๋ถ๋นํ๊ฒ ํ์ฌํ๊ณ , ์ฌ์ง์ด๋ ์์ ์ด๋ฆ๋ ๋ฐฑ์ค์๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋ฒ ์ ๊ฑฐ์์๋ ์ต๋ํ ๊ณตํํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ํ์ ํ๋ ค๊ณ ํ๋ค. ๋ฐฑ์ค์๋ N๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๊ตฌ์ญ์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. ๊ตฌ์ญ์ ๋ ๊ฐ์ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ์ผ ํ๊ณ ,ย ๊ฐ ๊ตฌ์ญ์ ๋ ์ ๊ฑฐ๊ตฌ ์ค ํ๋์ย ํฌํจ๋์ด์ผ ํ๋ค.ย ์ ๊ฑฐ๊ตฌ๋ ๊ตฌ์ญ์ ์ ์ด๋ ํ๋ ํฌํจํด์ผ ํ๊ณ , ํ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋์ด ์๋ ๊ตฌ์ญ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ๊ตฌ์ญ A์์ ์ธ์ ํ ๊ตฌ์ญ์ ํตํด์ ๊ตฌ์ญ B๋ก ๊ฐ ์ ์์ ๋, ๋ ๊ตฌ์ญ์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ๋ค. ์ค๊ฐ์ ํตํ๋ ์ธ์ ํ ๊ตฌ์ญ์ 0๊ฐ ์ด์์ด์ด์ผ ํ๊ณ , ๋ชจ๋ ๊ฐ์ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋ ๊ตฌ์ญ์ด์ด์ผ ํ๋ค. ์๋ ๊ทธ๋ฆผ์ 6๊ฐ์ ๊ตฌ์ญ์ด ์๋ ๊ฒ์ด๊ณ , ์ธ์ ํ ๊ตฌ์ญ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค.
์๋๋ ๋ฐฑ์ค์๋ฅผ ๋ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด๋ฉฐ, ๊ฐ๋ฅํ ๋ฐฉ๋ฒ๊ณผ ๋ถ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ํ ์์์ด๋ค.
๊ฐ๋ฅํ ๋ฐฉ๋ฒ [1, 3, 4]์ [2, 5, 6]์ผ๋ก ๋๋์ด์ ธ ์๋ค.
๊ฐ๋ฅํ ๋ฐฉ๋ฒ [1, 2, 3, 4, 6]๊ณผ [5]๋ก ๋๋์ด์ ธ ์๋ค.
๋ถ๊ฐ๋ฅํ ๋ฐฉ๋ฒ [1, 2, 3, 4]์ [5, 6]์ผ๋ก ๋๋์ด์ ธ ์๋๋ฐ, 5์ 6์ด ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค.
๋ถ๊ฐ๋ฅํ ๋ฐฉ๋ฒ ๊ฐ ์ ๊ฑฐ๊ตฌ๋ ์ ์ด๋ ํ๋์ ๊ตฌ์ญ์ ํฌํจํด์ผ ํ๋ค.
๊ณตํํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ๋๋๊ธฐ ์ํด ๋ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋ ์ธ๊ตฌ์ ์ฐจ์ด๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค. ๋ฐฑ์ค์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ตฌ์ญ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ ๊ตฌ์ญ์ ์ธ๊ตฌ๊ฐ 1๋ฒ ๊ตฌ์ญ๋ถํฐ N๋ฒ ๊ตฌ์ญ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ธ๊ตฌ๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด์ ธ ์๋ค. ์ ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ๊ตฌ์ญ๊ณผ ์ธ์ ํ ๊ตฌ์ญ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ณด์ ์ฒซ ๋ฒ์งธ ์ ์๋ ๊ทธ ๊ตฌ์ญ๊ณผ ์ธ์ ํ ๊ตฌ์ญ์ ์์ด๊ณ , ์ดํ ์ธ์ ํ ๊ตฌ์ญ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๋ชจ๋ ๊ฐ์ ์ ์๋ก ๊ตฌ๋ถ๋์ด์ ธ ์๋ค. ๊ตฌ์ญ A๊ฐ ๊ตฌ์ญ B์ ์ธ์ ํ๋ฉด ๊ตฌ์ญ B๋ ๊ตฌ์ญ A์ ์ธ์ ํ๋ค. ์ธ์ ํ ๊ตฌ์ญ์ด ์์ ์๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฐฑ์ค์๋ฅผ ๋ ์ ๊ฑฐ๊ตฌ๋ก ๋๋์์ ๋, ๋ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ์ ์๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
์ ํ
2 โค N โค 10 1 โค ๊ตฌ์ญ์ ์ธ๊ตฌ ์ โค 100
์์
์์ 1
์ ๋ ฅ
6
5 2 3 4 1 2
2 2 4
4 1 3 6 5
2 4 2
2 1 3
1 2
1 2
์ถ๋ ฅ
1
์์ 2
์ ๋ ฅ
6
1 1 1 1 1 1
2 2 4
4 1 3 6 5
2 4 2
2 1 3
1 2
1 2
์ถ๋ ฅ
0
์์ 3
์ ๋ ฅ
6
10 20 10 20 30 40
0
0
0
0
0
0
์ถ๋ ฅ
-1
์์ 4
์ ๋ ฅ
6
2 3 4 5 6 7
2 2 3
2 1 3
2 1 2
2 5 6
2 4 6
2 4 5
์ถ๋ ฅ
9
My Sol
def divSection(depth, s, M):
global groupA, groupB
if depth == M:
groupB = list(set(range(N)) - set(groupA))
if checkLink(groupA) and checkLink(groupB):
calcMin(groupA, groupB)
for k in range(s, N):
if not visited[k]:
visited[k] = 1
groupA.append(k)
divSection(depth+1, k+1, M)
visited[k] = 0
groupA.pop()
def checkLink(group):
global links
if len(group) == 1:
return True
i = group[0]
linkQ = []
for s in links[i]:
if s in group:
linkQ.append([i, s])
start = -1
end = len(linkQ)
visitedQ = [0]*N
visitedQ[i] = 1
while start < end-1:
start += 1
s1, s2 = linkQ[start]
if not visitedQ[s2]:
visitedQ[s2] = 1
for s in links[s2]:
if s in group:
linkQ.append([s2, s])
end += 1
for s in group:
if not visitedQ[s]:
return False
return True
def calcMin(groupA, groupB):
global populations, ans
sumA = 0
for s in groupA:
sumA += populations[s]
sumB = 0
for s in groupB:
sumB += populations[s]
diff = abs(sumA - sumB)
if ans > diff:
ans = diff
N = int(input())
populations = list(map(int, input().split()))
links = []
for k in range(N):
n, *link = list(map(int, input().split()))
link = [i-1 for i in link]
links.append(link)
visited=[0]*N
groupA = []
ans = 1000
for M in range(1, N//2+1):
divSection(0, 0, M)
ans = -1 if ans==1000 else ans
print(ans)
๊ฝค๋ ์ ๋ฅผ ๋จน์๋ ๋ฌธ์ ์๋ค. ์ฌ๊ท์ ์กฐํฉ์ผ๋ก ์ ์ฒด ๋ ธ๋๋ฅผ 2๋ถํ ํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํ์ฌ ๊ฐ ๋ถํ ๋ ๊ตฌ์ญ๋ค์ด ๊ทธ๋ฃน ๋ด์์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ, ์ ์ญ ๋ณ์์ธ ans์ ๋ํด ๊ฐ ๋ ธ๋์ ์ธ๊ตฌ์๋ฅผ ๋ํ ๊ตฌ์ญ ๋ด ์ธ๊ตฌ ์์ ์ฐจ์ ์ต์๊ฐ์ ๊ณ์ ๊ฐฑ์ ํ์ฌ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ
์
๋ ฅ์ ํ์์ ๋ง๊ฒ ์ฒ๋ฆฌํ๊ณ , ๊ฐ ๊ตฌ์ญ์ด ๋ค๋ฅธ ๊ตฌ์ญ๊ณผ ์ฐ๊ฒฐ๋๋ ์ ๋ณด๋ฅผ links
๋ฐฐ์ด์ ๋ฆฌ์คํธ ํญ๋ชฉ์ผ๋ก ์์ ๋ฃ์ด 2์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ค.
์กฐํฉ / DFS / Stack / ์ฌ๊ท : divSection()
DFS์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํด ์ ์ฒด N๊ฐ์ ๋ ธ๋์ ๋ํ์ฌ ๊ทธ๋ฃน์ ๋ถ๋ฅํ๋ค. 2๋ถํ ๋ก ํ ๋ฟ ํฌ๊ธฐ์ ์ ํ์ 1๋ถํฐ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ M์ผ๋ก ํ๊ณ ํจ์ ์ธ๋ถ ์ ์ญ์์ for๋ฌธ์ผ๋ก 1๋ถํฐ N//2๊น์ง M์ ์ง์ ํ์ฌ ํจ์์ ๋ฃ์ด์ฃผ์๋ค.
M์ groupA์ ๊ตฌ์ญ์ ๊ฐ์์ด๋ฏ๋ก ๊ทธ ์ด์์ ๋ฐ๋ํธ์ธ groupB์ ๊ฐ์ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ ํผํ๊ธฐ ์ํด N//2๊น์ง M์ ์ค์ ํด ์กฐํํ๋ค.
divSection() ํจ์์์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ตฌ์ญ์ ๋๋๋ค. depth๋ฅผ ์๋ค๊ฐ๋ค ํ๋ฉด์ groupA๋ฅผ ์ฑ์๊ฐ๋๋ฐ, M๊ฐ๋งํผ groupA๋ฅผ ์ฑ์ฐ๊ฒ ๋๋ค๋ฉด ๋๋จธ์ง ์ซ์๋ค์ groupB๋ก ๋๋์ด์ผ ํ๋ฏ๋ก set์ ์ด์ฉํด ์ฐจ์งํฉ์ผ๋ก groupB๋ฅผ ๊ตฌํ์๋ค.
groupA์ groupB๋ 0๋ถํฐ N-1๊น์ง์ ์ธ๋ฑ์ค๋ก ์ ํ์๊ณ , ์ด ์ธ๋ฑ์ค๋ฅผ checkLink()
ํจ์๋ก ์ ๋ฌํ์ฌ ์ด ํจ์ ๋ด๋ถ์์ ์ธ๋ฑ์ค ํ์์ผ๋ก ์ฌ์ฉํ๋ค.
Queue / BFS : checkLink()
์ธ์๋ก ์ ๋ฌ๋ group๋ด์ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ์๋ก๋ฅผ ํตํด์ ์ด๋ป๊ฒ๋ ์ฐ๊ฒฐ๋๋ค๋ฉด ์ฐ๊ฒฐ๋ ์ง์ญ์ผ๋ก True๋ฅผ ๋ฐํํ๊ณ , ์ด๋ ๊ตฌ์ญ์ด ์ฐ๊ฒฐ๋์ด์์ง ์๋ค๋ฉด False๋ฅผ ๋ฐํํ๋ ์ญํ ์ด๋ค.
๋ ธ๋ ์กฐํ์ด๊ธฐ ๋๋ฌธ์ DFS๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง ๋ค์ํ๊ฒ ์ฌ์ฉํด๋ณด๊ณ ์ BFS๋ฅผ ํ์ฉํ์๋ค. group์ด 1๊ฐ์ ๊ตฌ์ญ๋ง ๊ฐ์ง๋ค๋ฉด ๋ฌด์กฐ๊ฑด True๋ฅผ ๋ฐํํ๋ฏ๋ก ์ด๋ฅผ ์ฒ์์ ์กฐ๊ฑด์ผ๋ก ๋ฃ์ด์ฃผ์๊ณ , Queue๋ฅผ ์ด์ฉํด ์์๊ตฌ์ญ๊ณผ ์ฐ๊ฒฐ๋ ๊ตฌ์ญ์ list ํ์์ผ๋ก Queue์ ๋ฃ์ด์ฃผ๋ฉฐ ์ฐ๊ฒฐ์ ์กฐํํ์๋ค.
๋ฐฉ๋ฌธํ์๋์ง๋ฅผ visitedQ
๋ฐฐ์ด์ ์ด์ฉํด ์ฒดํฌํ๋ฉฐ, ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ์ visitedQ์ ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ฒดํฌํ๊ณ ํด๋น ๊ตฌ์ญ์์๋ถํฐ ๊ฐ ์ ์๋ ๊ตฌ์ญ๋ค์ ์ ๋ณด๋ฅผ [์์ ๊ตฌ์ญ, ์ฐ๊ฒฐ ๊ตฌ์ญ]์ผ๋ก Queue์ ์ฝ์
ํ์๋ค. visitedQ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ค์๋ ์ธ๋ฑ์ค ์ ๋ณด๋ง์ผ๋ก Queue์ ๋ํ ์ฝ์
์ ํผํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ฉํ๋ค.
์ด๋ group ๋ด์ ๋ฒํธ๋ค๊ณผ ์ฐ๊ฒฐ๋๋ ๋ ธ๋๋ค๋ง Queue์ ์ฝ์ ํ๋๋ฐ, ์ด์ฐจํผ ๋ค๋ฅธ ๊ตฌ์ญ๋ค์ ์ฐ๊ฒฐ๋๋ ์ ๋๋ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฃน ๋ด๋ถ์์๋ง ์์ง์ฌ์ผ ํ๋ค.
start์ end-1๊ฐ ๊ฐ์์ง๋, ์ฆ Queue๊ฐ ๋น๊ฒ ๋๋ค๋ฉด group๋ด์ ๊ตฌ์ญ ์ซ์๋ง๋ค visitedQ๋ฅผ ์กฐํํ์ฌ ๋ชจ๋ ๊ฐ์ด 1์ด๋ผ๋ฉด True, ํ๋๋ผ๋ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด False๋ฅผ ๋ฐํํ๋ค.
ํฉ๊ณ์ ์ฐจ์ด ์ต์๊ฐ ๊ณ์ฐ : calcMin()
2๋ถํ ํ ๋ ๊ทธ๋ฃน์ด ๋ชจ๋ True๋ฅผ ๋ฐํํ๋ค๋ฉด divSection() ํจ์ ๋ด์์๋ ์ด ๋ ๊ทธ๋ฃน์ ์ธ๊ตฌ์ ํฉ๊ณ๋ฅผ ๊ฐ๊ฐ ๊ณ์ฐํ๊ณ ์ด ์ฐจ์ด์ ๊ธฐ์กด ์ต์ ์ฐจ์ด๊ฐ์ ๋น๊ตํ์ฌ ๊ฐฑ์ ํ๋ค.
ํน๋ณํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ง ์์์ผ๋ฉฐ, min() ํจ์ ๋์ ์ if ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ ๊ฒ์ ์ต๊ด์ด๋ค..ใ ใ
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ