๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/86971
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
ํ์ด
n๊ฐ์ ์ก์ ํ์ด ์ ์ ์ ํตํด ํ๋์ ํธ๋ฆฌ ํํ๋ก ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ๋น์ ์ ์ด ์ ์ ๋ค ์ค ํ๋๋ฅผ ๋์ด์ ํ์ฌ์ ์ ๋ ฅ๋ง ๋คํธ์ํฌ๋ฅผ 2๊ฐ๋ก ๋ถํ ํ๋ ค๊ณ ํฉ๋๋ค. ์ด๋, ๋ ์ ๋ ฅ๋ง์ด ๊ฐ๊ฒ ๋๋ ์ก์ ํ์ ๊ฐ์๋ฅผ ์ต๋ํ ๋น์ทํ๊ฒ ๋ง์ถ๊ณ ์ ํฉ๋๋ค.
n์ 2 ์ด์ 100 ์ดํ์ธ ์์ฐ์์ ๋๋ค.wires๋ ๊ธธ์ด๊ฐ n-1์ธ ์ ์ํ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
wires์ ๊ฐ ์์๋ [v1, v2] 2๊ฐ์ ์์ฐ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ด๋ ์ ๋ ฅ๋ง์ v1๋ฒ ์ก์ ํ๊ณผ v2๋ฒ ์ก์ ํ์ด ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
1 ≤ v1 < v2 ≤ n ์ ๋๋ค.์ ๋ ฅ๋ง ๋คํธ์ํฌ๊ฐ ํ๋์ ํธ๋ฆฌ ํํ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
ํด๋น ๋ฌธ์ ๋ DFS(๊น์ด์ฐ์ ํ์), ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ค.
๋๋ ์์ง ์๋ฃ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ ์ ์ฝํด์, ๋ต์ ๋ณด๊ณ ๊ณต๋ถํ๋ ๋ฐฉ์์ ํํ๋ค^^;
์๋๋ AI๋ฅผ ํตํด ์ป์ด๋ธ ์ ๋ต ์ฝ๋๋ค.
def create_graph(n, wires):
"""
์ ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ ํจ์
n: ์ก์ ํ์ ๊ฐ์
wires: ์ ์ ์ ๋ณด๋ฅผ ๋ด์ 2์ฐจ์ ๋ฆฌ์คํธ, ๊ฐ ์ ์ ์ ๋ณด๋ [v1, v2] ํํ๋ก ์ฃผ์ด์ง๋ฉฐ v1๊ณผ v2๋ ์ฐ๊ฒฐ๋ ๋ ์ก์ ํ์ ๋ฒํธ๋ฅผ ๋ํ๋
๊ทธ๋ํ๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๋ก ํํ๋๋ฉฐ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ
์ก์ ํ์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋ฏ๋ก ์ธ๋ฑ์ค 0์ ์ฌ์ฉํ์ง ์์
"""
graph = [[] for _ in range(n + 1)]
for v1, v2 in wires:
graph[v1].append(v2)
graph[v2].append(v1)
return graph
def dfs(graph, start, visited):
"""
DFS ํ์์ ์ํํ์ฌ ์ฐ๊ฒฐ๋ ์ก์ ํ์ ๊ฐ์๋ฅผ ์ธ๋ ํจ์
graph: ๊ทธ๋ํ ์ ๋ณด๋ฅผ ๋ด์ 2์ฐจ์ ๋ฆฌ์คํธ
start: ํ์์ ์์ํ ์ก์ ํ์ ๋ฒํธ
visited: ์ก์ ํ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฆฌ์คํธ, visited[i]๋ i๋ฒ ์ก์ ํ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ์ด๊ธฐ๊ฐ์ ๋ชจ๋ False๋ก ์ค์ ๋จ
DFS ํ์์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ๋ ์ก์ ํ ํ์
์คํ์ ์ฌ์ฉํ์ฌ DFS ๊ตฌํ
๋ฐฉ๋ฌธํ ์ก์ ํ์ ๊ฐ์๋ฅผ count ๋ณ์์ ์ ์ฅํ์ฌ ๋ฐํ
"""
stack = [start]
count = 0
while stack:
node = stack.pop()
if not visited[node]:
visited[node] = True
count += 1
for neighbor in graph[node]:
if not visited[neighbor]:
stack.append(neighbor)
return count
def solution(n, wires):
"""
์ ๋ ฅ๋ง์ ์ต์ ์ผ๋ก ๋ถํ ํ์ฌ ๋ ๋คํธ์ํฌ์ ์ก์ ํ ๊ฐ์ ์ฐจ์ด์ ์ต์๊ฐ์ ๊ตฌํ๋ ํจ์
n: ์ก์ ํ์ ๊ฐ์
wires: ์ ์ ์ ๋ณด๋ฅผ ๋ด์ 2์ฐจ์ ๋ฆฌ์คํธ
ํ๋์ ์ ์ ์ ๋์ด์ ๋ ๊ฐ์ ๋คํธ์ํฌ๋ก ๋ถํ
๊ฐ ๋คํธ์ํฌ์ ์ก์ ํ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ๋ชฉํ
๋ชจ๋ ์ ์ ์ ๋ํด ํ๋์ฉ ์ ๊ฑฐํด๋ณด๋ฉด์ ์ก์ ํ ๊ฐ์ ์ฐจ์ด ๊ณ์ฐ
์ต์๊ฐ์ ์ฐพ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ํ์ํ ๊ฐ๋
: ๊ทธ๋ํ ์ด๋ก , ํธ๋ฆฌ ๊ตฌ์กฐ, DFS ํ์, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
"""
answer = float("inf")
for i in range(len(wires)):
# ๊ทธ๋ํ ์์ฑ
graph = create_graph(n, wires[:i] + wires[i + 1 :])
# ์ฒซ ๋ฒ์งธ ์ก์ ํ์์ ์์ํด์ ํ์
visited = [False] * (n + 1)
count = dfs(graph, 1, visited)
# ๋ ๋คํธ์ํฌ์ ์ก์ ํ ๊ฐ์ ์ฐจ์ด ๊ณ์ฐ
diff = abs(count - (n - count))
answer = min(answer, diff)
return answer
๋ฌธ์ ์ ์๊ตฌ์ฌํญ์ 1) ์ต๋ํ ๋ ์ ๋ ฅ๋ง์ ๋คํธ์ํฌ ์๊ฐ ๋น์ท, 2) ๋ ์ ๋ ฅ๋ง์ ์ฐจ์ด๊ฐ์ ์ ๋๊ฐ์ผ๋ก ๋ฐํ.
์ฆ ๋ ์ ๋ ฅ๋ง์ ์ฐจ์ด๊ฐ์ด ๊ฐ์ฅ ์ ์๊ฒฝ์ฐ๊ฐ ๋ต์ด ๋๊ฒ ๋ค.
- ๋จผ์ answer์ ๋ฌดํ๋("inf")๋ก ์ ์ธํด์ค๋ค.
- ์ก์ ํ ๋ฆฌ์คํธ wires์ ๊ธธ์ด๋งํผ ์ํํ๋ค. ์ฌ๊ธฐ์ i๋ ์ ๊ฑฐํ ์ ์ ์ด๋ค.
- i๋ฅผ ์ ์ธํ wires๋ฅผ create_graph ํจ์๋ฅผ ํตํด ๊ทธ๋ํ๋ก ๋ง๋ค์ด์ค๋ค.
- ๊ทธ ๋ค์ ์ก์ ํ์ ๊ฐฏ์(n)๋งํผ visited = [False]๋ฅผ ์ ์ธํ๋ค.
=> ์ฌ๊ธฐ์ [False] * n ์ด ์๋ [False] * (n+1)๋ก ์ ์ธํ ์ด์ ๋ ์ธ๋ฑ์ฑ์ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํด์๋ค. ์ก์ ํ์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ. - ํด๋น ๊ทธ๋ํ์ visited๋ก dfsํจ์๋ฅผ ์คํํ๋ค.
dfs ์ฝ๋ ์คํ ์์๋ ์๋์ ๊ฐ๋ค.
๋๋ณด๊ธฐ
๋ง์ฝ ์์ ๊ฐ์ graph, start, visited ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ๊ฐ์ ํด๋ณด์.graph = [[], [2, 3], [1, 3], [1, 2, 4], [3, 5, 6], [4], [4]] start = 1 visited = [False] * (len(graph))
์๋๋ AI๋ฅผ ํตํด ์์ฑํ dfs ํจ์ ์คํ ๊ณผ์ ์ด๋ค.
dfs ํจ์ ์คํ ๊ณผ์ :- stack์ [start]๋ก ์ด๊ธฐํํ๊ณ , count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
- stack = [1], count = 0
- stack์ด ๋น์ด์์ง ์์ ๋์ ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
- node๋ฅผ stack์์ popํฉ๋๋ค. node = 1
- visited[node]๊ฐ False์ธ ๊ฒฝ์ฐ:
- visited[node]๋ฅผ True๋ก ์ค์ ํฉ๋๋ค. visited[1] = True
- count๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค. count = 1
- graph[node]์ ์ฐ๊ฒฐ๋ ์ก์ ํ๋ค์ ํ์ธํฉ๋๋ค. graph[1] = [2, 3]
- ์ฐ๊ฒฐ๋ ์ก์ ํ 2๊ฐ visited[2] = False์ด๋ฏ๋ก stack์ ์ถ๊ฐํฉ๋๋ค. stack = [3, 2]
- ์ฐ๊ฒฐ๋ ์ก์ ํ 3์ด visited[3] = False์ด๋ฏ๋ก stack์ ์ถ๊ฐํฉ๋๋ค. stack = [3, 2]
- stack์์ ๋ค์ ๋
ธ๋๋ฅผ popํฉ๋๋ค. node = 2
- visited[2] = False์ด๋ฏ๋ก visited[2]๋ฅผ True๋ก ์ค์ ํฉ๋๋ค.
- count๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค. count = 2
- graph[2] = [1, 3]์ ์ฐ๊ฒฐ๋ ์ก์ ํ๋ค์ ํ์ธํฉ๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 1์ ์ด๋ฏธ visited[1] = True์ด๋ฏ๋ก stack์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 3์ ์ด๋ฏธ stack์ ์์ผ๋ฏ๋ก ์ถ๊ฐํ์ง ์์ต๋๋ค.
- stack์์ ๋ค์ ๋
ธ๋๋ฅผ popํฉ๋๋ค. node = 3
- visited[3] = False์ด๋ฏ๋ก visited[3]๋ฅผ True๋ก ์ค์ ํฉ๋๋ค.
- count๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค. count = 3
- graph[3] = [1, 2, 4]์ ์ฐ๊ฒฐ๋ ์ก์ ํ๋ค์ ํ์ธํฉ๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 1๊ณผ 2๋ ์ด๋ฏธ visited๊ฐ True์ด๋ฏ๋ก stack์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 4๋ visited[4] = False์ด๋ฏ๋ก stack์ ์ถ๊ฐํฉ๋๋ค. stack = [4]
- stack์์ ๋ค์ ๋
ธ๋๋ฅผ popํฉ๋๋ค. node = 4
- visited[4] = False์ด๋ฏ๋ก visited[4]๋ฅผ True๋ก ์ค์ ํฉ๋๋ค.
- count๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค. count = 4
- graph[4] = [3, 5, 6]์ ์ฐ๊ฒฐ๋ ์ก์ ํ๋ค์ ํ์ธํฉ๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 3์ ์ด๋ฏธ visited[3] = True์ด๋ฏ๋ก stack์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 5์ 6์ visited[5] = False, visited[6] = False์ด๋ฏ๋ก stack์ ์ถ๊ฐํฉ๋๋ค. stack = [6, 5]
- stack์์ ๋ค์ ๋
ธ๋๋ฅผ popํฉ๋๋ค. node = 5
- visited[5] = False์ด๋ฏ๋ก visited[5]๋ฅผ True๋ก ์ค์ ํฉ๋๋ค.
- count๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค. count = 5
- graph[5] = [4]์ ์ฐ๊ฒฐ๋ ์ก์ ํ๋ค์ ํ์ธํฉ๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 4๋ ์ด๋ฏธ visited[4] = True์ด๋ฏ๋ก stack์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- stack์์ ๋ค์ ๋
ธ๋๋ฅผ popํฉ๋๋ค. node = 6
- visited[6] = False์ด๋ฏ๋ก visited[6]๋ฅผ True๋ก ์ค์ ํฉ๋๋ค.
- count๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค. count = 6
- graph[6] = [4]์ ์ฐ๊ฒฐ๋ ์ก์ ํ๋ค์ ํ์ธํฉ๋๋ค.
- ์ฐ๊ฒฐ๋ ์ก์ ํ 4๋ ์ด๋ฏธ visited[4] = True์ด๋ฏ๋ก stack์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- stack์ด ๋น์ด์์ผ๋ฏ๋ก ๋ฐ๋ณต์ ์ข ๋ฃํ๊ณ , count ๊ฐ์ธ 6์ ๋ฐํํฉ๋๋ค.
- stack์ [start]๋ก ์ด๊ธฐํํ๊ณ , count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
- dfs ์คํ ๊ฒฐ๊ณผ๊ฐ count๋ฅผ ์ด์ฉํด ๋ ์ ๋ ฅ๋ง์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ค.
- ๋ง์ง๋ง์ผ๋ก min()ํจ์๋ฅผ ํตํด ๊ทธ ์ ์ ์ฐจ์ด๊ฐ๊ณผ ํ์ฌ ์ฐจ์ด๊ฐ ์ค ๋ ์ ์ ๊ฐ์ answer๋ก ์ฌํ ๋นํ๋ค.
ํ์ด๋ ์ด๊ฒ์ผ๋ก ๋์ด๋ค.
๋๋ ์ด์ ์๋ฃ๊ตฌ์กฐ ๊ณต๋ถ๋ฅผ ํ๋ฌ ๊ฐ์ผ๊ฒ ๋ค... ํ๋ก๊ทธ๋๋จธ์ค๋ ์ ์ ์ค๋จํ๊ณ ๋ฐฑ์ค์ผ๋ก ์ฎ๊ฒจ๊ฐ์๊ฐ์ด๋ค.
์ ํ๋ณ๋ก ํ์ด๋ณด๊ธฐ์ ๋ฐฑ์ค์ด ๋ ๋์๋ฏํ๋ค. ๋ฌธ์ ์ ์๋ ํจ์ฌ ๋ง๊ณ ~