[TIL] 99ํด๋ฝ ์ฝํ ์คํฐ๋ 5์ผ์ฐจ TIL - BFS : <๋ฐฑ์ค 24444 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 1> ๋ฌธ์ ํ์ด with python
Today's keyword : BFS
๐ ๊ฐ๋ ์ค๋ช
BFS(๋๋น ์ฐ์ ํ์)
- BFS๋ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ์์ ์ ์ ์์ ์ธ์ ํ ์ ์ ๋ค์ ๋จผ์ ๋ฐฉ๋ฌธํ ํ, ๊ทธ ์ ์ ์ ์ธ์ ํ ์ ์ ๋ค์ ํ์ํ๋ ๋ฐฉ์์ ๋๋ค. ์ฆ, "๋๋น"๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ํฉ๋๋ค.
- BFS๋ ํ(Queue) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ํ๋ FIFO(First In First Out) ๋ฐฉ์์ผ๋ก ์๋ํ์ฌ, ๋จผ์ ๋ค์ด์จ ์ ์ ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋ฉ๋๋ค.
๐ ๋ฌธ์ ์ค๋ช

https://www.acmicpc.net/problem/24444
์ด ๋ฌธ์ ๋ ์ฃผ์ด์ง ๊ทธ๋ํ์์ ๋๋น ์ฐ์ ํ์(BFS)์ ์ํํ๊ณ , ๊ฐ ์ ์ ์ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
์ ๋ ฅ
- ์ฒซ ๋ฒ์งธ ์ค์ ์ ์ ์ ์ n, ๊ฐ์ ์ ์ m, ์์ ์ ์ r์ด ์ฃผ์ด์ง๋๋ค.
- ๋ค์ m๊ฐ์ ์ค์๋ ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ค์ ๋ ์ ์ a์ b๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ a์ b๊ฐ ์ฐ๊ฒฐ๋์ด ์์์ ์๋ฏธํฉ๋๋ค.
์ถ๋ ฅ
- ๊ฐ ์ ์ ์ ๋ํด ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ 0์ผ๋ก ํ์ํฉ๋๋ค.
๐ ๋ฌธ์ ํ์ด
import sys
from collections import deque
input = sys.stdin.readline
n, m, r = map(int, input().split())
graph = [[] for i in range(n + 1)]
# m๊ฐ์ ๊ฐ์ ์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b) # a์์ b๋ก์ ๊ฐ์ ์ถ๊ฐ
graph[b].append(a) # b์์ a๋ก์ ๊ฐ์ ์ถ๊ฐ (์๋ฐฉํฅ)
# ๊ฐ ์ ์ ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
for i in range(1, n + 1):
graph[i].sort()
visited = [0] * (n + 1)
queue = deque()
visit_order = 1
def bfs(graph, v, visited):
global visit_order
queue.append(v)
while queue:
i = queue.popleft()
if visited[i] == 0:
visited[i] = visit_order
visit_order += 1
for j in graph[i]:
if visited[j] == 0: # ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ๋ง ์ถ๊ฐ
queue.append(j)
bfs(graph, r, visited)
for i in range(1, n + 1):
print(visited[i])
1. ๊ทธ๋ํ ์ด๊ธฐํ:
- ์ ์ ์ n, ๊ฐ์ ์ m, ์์ ์ ์ r์ ์ ๋ ฅ๋ฐ์ ๊ทธ๋ํ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ์ธ์ ๋ฆฌ์คํธ ํํ๋ก ๊ทธ๋ํ๋ฅผ ํํํ๊ธฐ ์ํด graph ๋ฆฌ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
2. ๊ฐ์ ์ ๋ณด ์ ๋ ฅ:
- m๊ฐ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ทธ๋ํ์ ์ถ๊ฐํฉ๋๋ค. ์๋ฐฉํฅ ๊ฐ์ ์ด๋ฏ๋ก ๋ ์ ์ ๋ชจ๋์ ๋ํด ์ฐ๊ฒฐ์ ์ถ๊ฐํฉ๋๋ค.
3. ์ ์ ์ ๋ ฌ
- ๊ฐ ์ ์ ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ, BFS ํ์ ์ ์ ์ ์ด ์์ ์์๋๋ก ๋ฐฉ๋ฌธ๋๋๋ก ํฉ๋๋ค.
4. BFS ๊ตฌํ:
- BFS๋ฅผ ์ํํ bfs ํจ์๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํจ์๋ ํ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ ์ ์ ๋ฐฉ๋ฌธํ๊ณ , ์ธ์ ํ ์ ์ ๋ค์ ํ์ ์ถ๊ฐํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋๋ง๋ค visited ๋ฆฌ์คํธ์ ํ์ฌ ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
5. BFS ํธ์ถ ๋ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
- ์์ ์ ์ r์์ BFS๋ฅผ ํธ์ถํ๊ณ , ๊ฐ ์ ์ ์ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๐ ์ฃผ์์ฌํญ
1. Deque ์ฌ์ฉ
ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค๋ฅธ์ชฝ์ ์ฝ์ (append)ํ๊ณ ์ผ์ชฝ์์ ์ถ์ถ(popleft)ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๊ณผ ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์๋ฐฉํฅ ์๋ฃํ์ธ deque๋ฅผ ์ด์ฉํฉ๋๋ค. deque๋ collections ํจํค์ง์ deque ํด๋์ค๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
from collections import deque
2. ๋ฐฉ๋ฌธํ ์ ์ ์ ํ์ ์ถ๊ฐํ์ง ์๊ธฐ
์ ์ ์ ํ์ ์ฝ์ ํ ๋ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ๋ง ์ถ๊ฐํ๋๋ก ํด์ผ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง ์์ต๋๋ค.
์ฒ์์ ํด๋น ์กฐ๊ฑด ์์ด ์ถ๊ฐํด์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ์๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๋ ํ์ ์ถ๊ฐํ์ฌ ์ธ๋ฐ์์ด ์ฐ์ฐ ๊ณผ์ ์ด ๊ธธ์ด์ก์์ ์ ์ ์์ต๋๋ค.
deque([1])
1 [0, 1, 0, 0, 0, 0]
deque([2, 4])
2 [0, 1, 2, 0, 0, 0]
deque([4, 1, 3, 4])
4 [0, 1, 2, 0, 3, 0]
deque([1, 3, 4, 1, 2, 3])
deque([3, 4, 1, 2, 3])
3 [0, 1, 2, 4, 3, 0]
deque([4, 1, 2, 3, 2, 4])
deque([1, 2, 3, 2, 4])
deque([2, 3, 2, 4])
deque([3, 2, 4])
deque([2, 4])
deque([4])
3. sys.stdin.readline ์ฌ์ฉ
input()์ผ๋ก๋ง ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ธฐ ๋๋ฌธ์ input = sys.stdin.readline ์ ํตํด ์ ๋ ฅ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. input() ํจ์๋ ์ ๋ ฅ์ ๋ฐ์ ๋๋ง๋ค ์ ๋ ฅ์ ๋ฐ๊ณ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๊ณ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ๋ฑ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉฐ ์ ๋ ฅ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐ๋ฉด, sys.stdin.readline์ ํ ๋ฒ์ ์ ์ฒด ์ค์ ์ฝ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
์ค๋์ ํ๊ณ
- ์๊ฐ ์ด๊ณผ๊ฐ ๋์ง ์๊ฒ ํ๊ธฐ
#99ํด๋ฝ #์ฝ๋ฉํ ์คํธ์ค๋น #๊ฐ๋ฐ์์ทจ์ #ํญํด99 #TIL