โ๏ธ ๋ฌธ์
[ํ๋ก๊ทธ๋๋จธ์ค/Programmers] ์ ๋ ฅ๋ง์ ๋๋ก ๋๋๊ธฐ(https://school.programmers.co.kr/learn/courses/30/lessons/86971)
n๊ฐ์ ์ก์ ํ์ด ์ ์ ์ ํตํด ํ๋์ ํธ๋ฆฌ ํํ๋ก ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ๋น์ ์ ์ด ์ ์ ๋ค ์ค ํ๋๋ฅผ ๋์ด์ ํ์ฌ์ ์ ๋ ฅ๋ง ๋คํธ์ํฌ๋ฅผ 2๊ฐ๋ก ๋ถํ ํ๋ ค๊ณ ํฉ๋๋ค. ์ด๋, ๋ ์ ๋ ฅ๋ง์ด ๊ฐ๊ฒ ๋๋ ์ก์ ํ์ ๊ฐ์๋ฅผ ์ต๋ํ ๋น์ทํ๊ฒ ๋ง์ถ๊ณ ์ ํฉ๋๋ค. ์ก์ ํ์ ๊ฐ์ n, ๊ทธ๋ฆฌ๊ณ ์ ์ ์ ๋ณด wires๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ ์ ๋ค ์ค ํ๋๋ฅผ ๋์ด์ ์ก์ ํ ๊ฐ์๊ฐ ๊ฐ๋ฅํ ๋น์ทํ๋๋ก ๋ ์ ๋ ฅ๋ง์ผ๋ก ๋๋์์ ๋, ๋ ์ ๋ ฅ๋ง์ด ๊ฐ์ง๊ณ ์๋ ์ก์ ํ ๊ฐ์์ ์ฐจ์ด(์ ๋๊ฐ)๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- n์ 2 ์ด์ 100 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- wires๋ ๊ธธ์ด๊ฐ n-1์ธ ์ ์ํ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- wires์ ๊ฐ ์์๋ [v1, v2] 2๊ฐ์ ์์ฐ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ด๋ ์ ๋ ฅ๋ง์ v1๋ฒ ์ก์ ํ๊ณผ v2๋ฒ ์ก์ ํ์ด ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- 1 ≤ v1 < v2 ≤ n ์ ๋๋ค.
- ์ ๋ ฅ๋ง ๋คํธ์ํฌ๊ฐ ํ๋์ ํธ๋ฆฌ ํํ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
๐ค ์ ์ถ๋ ฅ ์์
์ ์ถ๋ ฅ ์
๐ง ๋์ด๋/์์ ์๊ฐ
โ ๋์ด๋: ํ๋ก๊ทธ๋๋จธ์ค Level.2
โ ์์ ์๊ฐ: 2์๊ฐ ์ด๊ณผ(ํ๋ค๊ฐ ์ ๋ ๋จน์ผ๋ฌ ๊ฐ์ ๋ฆฌ์ ํ ๋ฒ ํ์)
โ ๊ถ์ฅ ์๊ฐ: 1์๊ฐ 15๋ถ
๋ค๋ค ์ด๊ฑธ ์ด๋ป๊ฒ 1์๊ฐ 15๋ถ ๋ง์ ํธ๋ ๊ฑด๊ฐ์ …
๐ก ํ์ด
1) ๋ฌธ์ ์ดํด
๋ฌธ์ ์ค๋ช ๊ณผ ์ ์ถ๋ ฅ ์์๊ฐ ์น์ ํด์ ์ ํ ๊ทธ๋๋ก ๋ฐ์๋ค์ด๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ดํด๋ ์ด๋ ต์ง ์์๋ค.
๊ฐ์ ์ ํ๋์ฉ ๋ค ๋์ด๋ณด๋ฉด์ ๊ฐ ์ ๋ ฅ๋ง์ ๊ตฌ์ฑํ๋ ๋ ธ๋ ๊ฐ์ ์ฐจ์ด์ ์ต์๊ฐ์ ์ฐพ์๊ฐ๋ฉด ๋ผ์ ์์ ํ์ ๋ฌธ์ ๋ก ๋ถ๋ฅ๋์ด ์๋ ๊ฒ ๊ฐ๋ค. ์ ๋์จ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ์ด ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค๊ณ ํ๋๋ฐ ๊ทธ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๊ณ ์ด ๋ฌธ์ ์ ์ ์ฉํ๋ ค๋ฉด ์ค๋ ์์๋ ๋ชป ํ ๊ฒ ๊ฐ์์ผ๋ฏ๋ก ์์ ํ์ ํ์ด ๋ฐฉ๋ฒ๋ง ๊ณ ๋ฏผํด๋ดค๋ค.
์์ ํ์์ ์ํํ๊ธฐ ์ํด BFS/DFS ์ค ๋ญ ์จ์ผ ํ๋ ์ถ์๋๋ฐ ์ต์๊ฐ์ ๊ตฌํ๋ ๊ฒ ๋ชฉํ๋๊น BFS๋ก ์ ๊ทผํด๋ณด๊ธฐ๋ก ํ๋ค.
2) ์์ด๋์ด ํ๋ฆ ๋ฐ ์ฝ๋
โ ๊ฐ์ ํ๋์ฉ ๋๊ธฐ
for i in range(len(wires)):
splited_wire = wires[:i]+wires[i+1:] # i๋ฒ์งธ ๊ฐ์ ์ญ์
network = make_graph(n, splited_wire) # ์ฐ๊ฒฐ์ด ๋์ด์ง ์ํ๋ก ํ๋์ ์๋ธํธ๋ฆฌ ๊ทธ๋ํ ์์ฑ
- splited_wire = wires[:i]+wires[i+1:]
- wires = [[1, 2], [2, 3], [3, 4]]๋ผ๊ณ ํ ๋ 0๋ฒ์งธ ๊ฐ์ ์ ์ญ์ ํ๋ฉด splited_wire = [[2, 3], [3, 4]] ๊ฐ ๋๋ค. 2์ 3์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ ๋์๋ค๋ ์๋ฏธ๋ก ์ด ๊ฒฝ์ฐ์๋ 1-2 / 3-4 ๋ ๊ฐ๋ก ํธ๋ฆฌ๊ฐ ๋๋๊ฒ ๋๋ค.
- network = make_graph(n, splited_wire)
- ์ด๊ธฐ์ ์ฃผ์ด์ง wires๋ ๋ชจ๋ ์ฐ๊ฒฐ๋ ์ํ์ด์ง๋ง ๊ฐ์ ์ ํ๋์ฉ ๋์ด์ฃผ๋ฉด์ ์๋ธํธ๋ฆฌ๋ฅผ ํ์ธํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ๋์ ๋๋ง๋ค ์๋ก์ด ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋ถ๋ถ์ด๋ค.
- ์ฒ์์๋ ์ฐ๊ฒฐ์ด ๋๊ธด ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ด๊ธฐ ์ํ ๊ทธ๋๋ก ์ฌ์ฉํ๋๋ ๊ณ์ ์์์ ๋ค๋ฅธ ๋ต์ด ์ถ๋ ฅ๋๊ณ ๊ฐ์ ์ ๋์ ๋๋ง๋ค ์๋ก์ด ๋คํธ์ํฌ๋ก ๊ฐฑ์ ํ์ง ์์์ ๋ฐ์ํ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค.
โก BFS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์๋ธํธ๋ฆฌ ๋ ธ๋ ๊ฐ์ ํ์ธ
def BFS(node, visited, graph):
queue = deque([node])
node_cnt = 1
while queue:
v = queue.popleft()
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
node_cnt += 1
return node_cnt
- splited_wire๋ฅผ ์ด๋ฃจ๊ณ ์๋ ๋ ธ๋๋ค์ ์ด์ฉํด ํ ์๋ธํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์๋ฅผ ํ์ธํ๋ค.
- ๋ ธ๋ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํ ๋ณ์๋ง ์ ์ ์ธํด์ฃผ๋ฉด ๋๊ณ ๋๋จธ์ง ๋ถ๋ถ์ BFS ๊ตฌํ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
โข ์ก์ ํ ๊ฐ์ ์ฐจ์ด ๊ฐฑ์
answer = min(answer, abs(subtree_node-(n-subtree_node)))
- abs(subtree_node-(n-subtree_node)))
- ์ฝ๋๋ฅผ ๋ฐ๋ก ๋ผ์ ์ ๋ค ๋ณด๋ ์ด ๊ณผ์ ์์๋ ์๋ต๋์ง๋ง subtree_node๋ BFS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํ ํ ์๋ธํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์์ด๋ค.
- ์ฆ, 1-2 / 3-4 ๋ก ํธ๋ฆฌ๊ฐ ๋๋ ์ก๋ค๊ณ ํ ๋ subtree_node๋ 2๊ฐ ๋๋ค.
- n-subtree_node๋ ์ ์ฒด ๋ ธ๋ ์์์ ๋ฏธ๋ฆฌ ๊ตฌํด๋ subtree_node๋ฅผ ๋นผ์ ๋จ์ ์๋ธํธ๋ฆฌ์ ๋ ธ๋๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์ด๋ค.
3) ์ ์ฒด ์ฝ๋
from collections import deque
def make_graph(n, current_wires):
graph = {k: [] for k in range(1, n+1)}
for pair in current_wires:
u, v = pair
graph[u].append(v)
graph[v].append(u)
return graph
def solution(n, wires):
answer = 999
# ํ์ํธ๋ฆฌ์ ๋
ธ๋ ๊ฐ์ ์ธ๋ ์ญํ
def BFS(node, visited, graph):
queue = deque([node])
node_cnt = 1
while queue:
v = queue.popleft()
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
node_cnt += 1
return node_cnt
# ์ ๋๊ธฐ
for i in range(len(wires)):
splited_wire = wires[:i]+wires[i+1:]
network = make_graph(n, splited_wire)
for src, dest in splited_wire:
visited = [False]*(n+1)
visited[src] = True
subtree_node = BFS(src, visited, network)
answer = min(answer, abs(subtree_node-(n-subtree_node)))
return answer
6) ์ด๋ ค์ ๋ ์ /๋ฐฐ์ด ์
๐จ ์ด๋ ค์ ๋ ์
- BFS ์๊ณ ๋ฆฌ์ฆ์ด ๋ต์ ๊ตฌํ๋ ๋ฐ์ ์ง์ ์ ์ผ๋ก ์ฐ์ด์ง ์์๋ค๋ ์
- ์์ ์ฐพ๊ธฐ ๋ฌธ์ ์์ DFS ์๊ณ ๋ฆฌ์ฆ์ด ์ซ์ ์กฐํฉ์ ๋ง๋๋ ๋ฐ์ ์ฌ์ฉ๋๋ ๊ฒ์ฒ๋ผ ์ด ๋ฌธ์ ์์๋ BFS ์๊ณ ๋ฆฌ์ฆ์ ์ญํ ์ ์๋ธํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์๋ฅผ ์ธ๋ ๊ฒ์ด์๋ค.
- ์ด ๋ถ๋ถ์ ์ ์ํ์ง ๋ชปํ๋ฉด ์์ ๋ฌธ์ ๋ฅผ ํ ์ ์์์ ๊ฑฐ๋ผ ์ค์ํ ๋ถ๋ถ์ธ ๊ฑด ๋ง๋ค. ํ์ง๋ง ๋ ธ๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฐ์ ๋์ด ์๋๋ผ ๊ทธ๊ฑธ ํ์ฉํด์ ์๋ธํธ๋ฆฌ๊ฐ ๋ ธ๋ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ ๊ฐฑ์ ํด๋๊ฐ์ผํ๋ ๊ฑธ ๋ ์ฌ๋ฆฌ๋ ๊ฒ ์ด๋ ค์ ๋ค.
โ ๋ฐฐ์ด ์
- ์ฒ์์๋ ์ด๋ ค์๋ณด์ด๋ ๋ฌธ์ ๋ ๋ด๊ฐ ๊ฐ์ง ์ง์์ ์ ์กฐํฉํ๋ฉด ํ ์ ์๋ค.
'Problem Solving > [ํญํด99] TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
99ํด๋ฝ ์ฝํ ์คํฐ๋ 26์ผ์ฐจ TIL / ์ํ&DP(๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ) (0) | 2024.11.22 |
---|---|
99ํด๋ฝ ์ฝํ ์คํฐ๋ 25์ผ์ฐจ TIL / ์์ ํ์ (0) | 2024.11.21 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 23์ผ์ฐจ TIL / ์์ ํ์ (0) | 2024.11.19 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 22์ผ์ฐจ TIL / ์์ ํ์ (1) | 2024.11.18 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 21์ผ์ฐจ TIL / ์์ ํ์ (0) | 2024.11.17 |