[Python] ๋ฐฑ์ค 1325 ํจ์จ์ ์ธ ํดํน (BFS)


๐ ๋ฌธ์
ํด์ปค ๊น์ง๋ฏผ์ ์ ์๋ ค์ง ์ด๋ ํ์ฌ๋ฅผ ํดํนํ๋ ค๊ณ ํ๋ค. ์ด ํ์ฌ๋ N๊ฐ์ ์ปดํจํฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊น์ง๋ฏผ์ ๊ท์ฐฎ๊ธฐ ๋๋ฌธ์, ํ ๋ฒ์ ํดํน์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ์ปดํจํฐ๋ฅผ ํดํน ํ ์ ์๋ ์ปดํจํฐ๋ฅผ ํดํนํ๋ ค๊ณ ํ๋ค.
์ด ํ์ฌ์ ์ปดํจํฐ๋ ์ ๋ขฐํ๋ ๊ด๊ณ์, ์ ๋ขฐํ์ง ์๋ ๊ด๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, A๊ฐ B๋ฅผ ์ ๋ขฐํ๋ ๊ฒฝ์ฐ์๋ B๋ฅผ ํดํนํ๋ฉด, A๋ ํดํนํ ์ ์๋ค๋ ์๋ฆฌ๋ค.
์ด ํ์ฌ์ ์ปดํจํฐ์ ์ ๋ขฐํ๋ ๊ด๊ณ๊ฐ ์ฃผ์ด์ก์ ๋, ํ ๋ฒ์ ๊ฐ์ฅ ๋ง์ ์ปดํจํฐ๋ฅผ ํดํนํ ์ ์๋ ์ปดํจํฐ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์, N๊ณผ M์ด ๋ค์ด์จ๋ค. N์ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์, M์ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ์ ๋ขฐํ๋ ๊ด๊ณ๊ฐ A B์ ๊ฐ์ ํ์์ผ๋ก ๋ค์ด์ค๋ฉฐ, "A๊ฐ B๋ฅผ ์ ๋ขฐํ๋ค"๋ฅผ ์๋ฏธํ๋ค. ์ปดํจํฐ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ํ๋์ฉ ๋งค๊ฒจ์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์, ๊น์ง๋ฏผ์ด ํ ๋ฒ์ ๊ฐ์ฅ ๋ง์ ์ปดํจํฐ๋ฅผ ํดํนํ ์ ์๋ ์ปดํจํฐ์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
5 4
3 1
3 2
4 3
5 3
์์ ์ถ๋ ฅ 1
1 2
๐ ํ์ด
๐ฌ Code
import sys
from collections import deque
input = sys.stdin.readline
def bfs(node):
q = deque([node])
visited = [0] * (n + 1)
visited[node] = 1
cnt = 1
while q:
v = q.popleft()
for i in graph[v]:
if not visited[i]:
q.append(i)
visited[i] = 1
cnt += 1
return cnt
if __name__ == '__main__':
n, m = map(int, input().split())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
a, b = map(int, input().split())
graph[b].append(a)
maximum = 0
idx = []
for i in range(1, n + 1):
ret = bfs(i)
if maximum < ret:
idx = [i]
maximum = ret
elif maximum == ret:
idx.append(i)
print(*idx, sep=' ')
๐ก Solution
A๊ฐ B๋ฅผ ์ ๋ขฐํ ๋, B๋ง ํดํนํ๋ฉด A๋ ํดํนํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ B์ ์ฐ๊ฒฐ ์ ๋ณด์ A๋ฅผ ๋ฃ์ด์ฃผ๋ ๋จ๋ฐฉํฅ ๊ทธ๋ํ๋ก ๊ตฌํํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ B๋ฅผ ํดํนํ์ ๋ ๋ช ๊ฐ์ ์ปดํจํฐ๋ฅผ ํดํนํ ์ ์๋์ง 'B์ ์ฐ๊ฒฐ ์ ๋ณด'๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. A์ ์ฐ๊ฒฐ ์ ๋ณด๋ ์ด ๋ฌธ์ ์์ ํ์๊ฐ ์์ต๋๋ค.
bfs(i)ํจ์์ cnt ์ ๋ณด๋ฅผ ์ถ๊ฐํด i๋ฅผ ํดํนํ๋ฉด ๋ช ๊ฐ์ ์ปดํจํฐ๋ฅผ ๋ค์ผ๋ก ํดํนํ ์ ์๋์ง i์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ์ ๊ฐฏ์์ธ cnt๋ฅผ ๋ฐํํฉ๋๋ค.
bfs(i)ํจ์๋ฅผ ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ฉด์ cnt๋ฅผ ๋น๊ตํด์ผ ํ๋ฏ๋ก, visited ๋ฐฐ์ด์ ์ ์ธ์ mainํจ์๊ฐ ์๋ bfs(i)ํจ์ ์์ ํ์ฌ bfs๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋ฐฉ๋ฌธ ์ ๋ณด๋ฅผ ์ด๊ธฐํํด์ฃผ์ด์ผํจ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
Python3๊ณผ Pypy3์ ์ฐจ์ด
Python3์ผ๋ก ์ ์ถํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๊ธฐ ๋๋ฌธ์ Pypy3์ผ๋ก ์ ์ถํด์ผ ํ์ต๋๋ค. ๋์ด ๋ญ๊ฐ ๋ค๋ฅธ์ง ๊ถ๊ธํด ์ฐพ์๋ดค์ต๋๋ค. ๐ค
- PyPy3๋ ์คํ์ ์์ฃผ ์ฐ์ด๋ ์ฝ๋๋ฅผ ์บ์ฑํ๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์, ์ฆ ๋ฉ๋ชจ๋ฆฌ๋ฅผ Python3๋ณด๋ค ์กฐ๊ธ ๋ ์ฌ์ฉํ๋ฉด์ ์ด ์ฝ๋๋ฅผ ์ ์ฅํ๊ณ ์์ด ์คํ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๊ฐ๋จํ ์ฝ๋๋ Python3๊ฐ ๋ฉ๋ชจ๋ฆฌ, ์๋ ์ธก์์ ์ฐ์ธํ๊ณ
๋ณต์กํ ์ฝ๋, ์ฃผ๋ก ๋ฐ๋ณต์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์์๋ PyPy3๊ฐ ์ฐ์ธํ๊ธฐ ๋๋ฌธ์
์ฝ๋ ์ํฉ์ ๋ง์ถ์ด ๋์ ์ ์ฌ์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค! ๐ก
defaultdict()
๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ป๊ฒ ํธ์ จ์๊น ๊ถ๊ธํด์ ์ฐพ์๋ณด๋๋ฐ graph๋ฅผ defaultdict๋ก ์ ์ธํ ํ์ด๊ฐ ๋ง์ด ๋ณด์์ต๋๋ค. defaultdict๋ ์ฒ์ ๋ณด๋ ์์ด๋ผ ๊ถ๊ธ์ฆ์ด ๋์ ธ์ ์ง์ ๋๋ ค๋ดค์ต๋๋ค ๐ค
- defaultdict ์ฌ์ฉ X
graph = [[] for _ in range(n + 1)]
…
print(graph)
# ์ถ๋ ฅ๊ฒฐ๊ณผ [[], [3], [3], [4, 5], [], []]
์ฐ๊ฒฐ์ ๋ณด๊ฐ ์๋ ์ปดํจํฐ์ ๊ฒฝ์ฐ ๋น ๋ฆฌ์คํธ []๋ก ๋จ์ต๋๋ค.
- defaultdict ์ฌ์ฉ O
from collections import defaultdict
graph = defaultdict(list)
…
print(graph)
# ์ถ๋ ฅ๊ฒฐ๊ณผ defaultdict(<class 'list'>, {1: [3], 2: [3], 3: [4, 5]})
์ฐ๊ฒฐ์ ๋ณด๊ฐ ์๋ ์ปดํจํฐ์ ๊ฒฝ์ฐ ์์ key: value set์กฐ์ฐจ ์์ฑ๋์ง ์์ต๋๋ค.
์์ง ์ด๋ ์ํฉ์์ ์ฐ๋ฉด ์ข์์ง ๊ฐ์ ์กํ๋๋ง๋์ธ๋ฐ ์ข์ ์ ๊ทผ์ ์๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค!