-
[Python] ๋ฐฑ์ค 1325 ํจ์จ์ ์ธ ํดํน (BFS)๐ป Algorithm/Python 2022. 7. 2. 15:33
๐ ๋ฌธ์
ํด์ปค ๊น์ง๋ฏผ์ ์ ์๋ ค์ง ์ด๋ ํ์ฌ๋ฅผ ํดํนํ๋ ค๊ณ ํ๋ค. ์ด ํ์ฌ๋ 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์กฐ์ฐจ ์์ฑ๋์ง ์์ต๋๋ค.
์์ง ์ด๋ ์ํฉ์์ ์ฐ๋ฉด ์ข์์ง ๊ฐ์ ์กํ๋๋ง๋์ธ๋ฐ ์ข์ ์ ๊ทผ์ ์๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค!'๐ป Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 1913 ๋ฌํฝ์ด (๊ตฌํ) (0) 2022.07.02 [Python] ๋ฐฑ์ค 2178 ๋ฏธ๋ก ํ์ (BFS) (0) 2022.07.02 [Python] ๋ฐฑ์ค 11725 ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ (DFS) (0) 2022.07.02 [Python] ๋ฐฑ์ค 19583 ์ธ์ด๋ฒ๊ฐ๊ฐ์ดํ (Set) (0) 2022.07.02 [Python] ๋ฐฑ์ค 2594 ๋์ด๊ณต์ (๊ตฌํ) (0) 2022.07.02