[Baekjoon/๐ฅSilverโ ก] 18352: ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
Intro
- ์
๋ ฅ
- N: ๋์์ ์ (1~N)
- M: ๋จ๋ฐฉํฅ ๋๋ก์ ์
- X: ์์์ ๋์ (1<= X <= N)
- K: ๊ตฌํ๊ณ ์ ํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ
- ์ถ๋ ฅ: ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋์๋ค์ ์ฐจ๋ก๋ก ์ถ๋ ฅํ๋ค.
๐โโ๏ธ์ ๊ทผ ๋ฐฉ๋ฒ
์ต๋จ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋์๋ค์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ๋์ X์์๋ถํฐ ์์ํด ๋ชจ๋ ๋์๋ค์ ๋ํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์์์ผํ๋ค.
๋ชจ๋ ๋๋ก์ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๋ผ๋ ๊ฐ์ ์ด ์กด์ฌํ๋ฏ๋ก ํด๋น ๋ฌธ์ ๋ ๊ฐ์ค์น๋ฅผ 1๋ก ํ ๋ค์ต์คํธ๋ผ๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์๋ค.
๋ํ, ๋ชจ๋ ๊ฐ์ค์น๊ฐ 1๋ก ๋์ผํ๋ฏ๋ก ๋จ์ํ BFS(๋๋น ์ฐ์ ํ์)์ ํตํด์๋ ํด๊ฒฐํ ์ ์๋ค.
๐BFS(๋๋น ์ฐ์ ํ์) VS DFS(๊น์ด ์ฐ์ ํ์)
๊ทธ๋ ๋ค๋ฉด ์ฐ์ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๋๊ฐ์ง ๋ฐฉ์์ ๋ํด์ ์ดํด๋ณด์.
๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์๋ ๋๊ฐ์ง ๋ฐฉ์์ด ์กด์ฌํ๋ค.
- BFS(๋๋น ์ฐ์ ํ์)
- DFS(๊น์ด ์ฐ์ ํ์)
์ ๊ทธ๋ํ๋ฅผ ํ์ํ๊ณ ์ ํ ๋ ์ฐ์ ๋๋น ์ฐ์ ํ์๋ฅผ ์ ์ฉํด๋ณด์!
๐BFS(๋๋น ์ฐ์ ํ์)
ํด๋น ํ์ ๋ฐฉ๋ฒ์ ์ด๋ฆ ๊ทธ๋๋ก ๋๋น๋ฅผ ์ค์ฌ์ผ๋ก ํ์์ ์งํํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ํ์ ๊น์ด๋ฅผ ๋จ๊ณ๋ก ํ์ํ๋ค๋ฉด 1๋จ๊ณ -> 2๋จ๊ณ -> 3๋จ๊ณ -> 4๋จ๊ณ์์ผ๋ก ํ์์ ์งํํ๋ค.
- ์ฌ๊ธฐ์ ๋๋น๋ฅผ ์ค์ฌ์ผ๋ก ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ A๋ฅผ ํ์ํ ํ์๋ 2๋จ๊ณ์ B์ C, 3๋จ๊ณ์ D, E, F, 4๋จ๊ณ์ G, H์์ผ๋ก ํ์์ด ๋ง๋ฌด๋ฆฌ๋๋ค.
๐DFS(๊น์ด ์ฐ์ ํ์)
๊ทธ๋ ๋ค๋ฉด ๊น์ด ์ฐ์ ํ์์ ๊ฒฐ๊ณผ๋ ์ด๋จ๊น?
์๋ง BFS ๋ฐฉ์์ ์ดํด๋ณด๋ฉด์ DFS์ ๋ฐฉ์ ๋ํ ์์ธกํ ์ ์์์ ๊ฒ์ด๋ค!! ๊น์ด ์ฐ์ ํ์ ๋ฐฉ๋ฒ ๋ํ ์ด๋ฆ ๊ทธ๋๋ก ๊น์ด๋ฅผ ์ค์ฌ์ผ๋ก ํ์์ ์งํํ๋ค.
๊ทธ๋ํ์ ๊น์ด๋ฅผ ๋จ๊ณ๋ก ํ์ํ๋ค๋ฉด 1๋จ๊ณ -> 2๋จ๊ณ -> 3๋จ๊ณ -> 4๋จ๊ณ์์ผ๋ก ํ์์ ์งํํ๋ ๊ฒ์ BFS์ ๋์ผํ๋ค.
-
์ฌ๊ธฐ์ ๊น์ด๋ฅผ ์ค์ฌ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์์์ ์ธ A์์๋ถํฐ ๊ฐ ์ ์๋ ๊ฐ์ฅ ๋์ ๋จ๊ณ๊น์ง ํ์์ ๋จผ์ ์งํํ๋ค. ์ฆ, A -> B -> D -> G๊ฐ ๋จผ์ ํ์์ด ์งํ๋๋ค.
-
์ด ๋ฐฉ์ ๋ํ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์์ด ์งํ๋๋ฏ๋ก ๋ค์ ์งํํ ์ ์๋ ๊น์ด ํ์์ด ์ด์ด์ ์งํ๋๋ค. ์ฆ, E -> H๊ฐ ํ์๋๋ค.
-
๋ง์ง๋ง์ผ๋ก C -> F๊ฐ ํ์๋๋ฉด์ ํ์์ด ๋๋๊ฒ ๋๋ค.
๐ฉ ํด๋น ๋ฌธ์ ์์๋ ์์์ ์์๋ถํฐ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋์๋ค์ ๋ชจ๋ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ฏ๋ก DFS๊ฐ ์๋ BFS๋ฅผ ์ฌ์ฉํด ํน์ ๋จ๊ณ์ ์๋ ๋ชจ๋ ์ ์ ์ ์ถ๋ ฅํ๋ฉด ๋๋ค!
๐ฉโ๐ปAlgoritm: BFS(๋๋น ์ฐ์ ํ์)
๊ทธ๋ ๋ค๋ฉด BFS ๋ฐฉ์์ ์ ์ฉํด ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํด๋ณด์!
#21.11.03
#BFS ์ฌ์ฉ
import sys
from collections import deque
# X๋ก ์์ํด์ ๊ฐ ์ง์ ๊น์ง ๊ฐ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ
N, M, K, X = map(int, sys.stdin.readline().split())
lst = [M+1 for _ in range(N+1)]
lst[X] = 0
#๋จ๋ฐฉํฅ ๋๋ก ์ ์ฅ
road = [[] for _ in range(N+1)]
for j in range(M):
temp1, temp2 = map(int, sys.stdin.readline().split())
road[temp1].append(temp2)
que = deque([X])
while que:
// ๋ฑ์์ ๋ค์ ํ์ํด์ผ ํ ๋์์ ๊บผ๋
check = que.popleft()
// ํด๋น ์ ์ ์์ ๊ฐ ์ ์๋ ์ ์ ์ ์ฐจ๋ก๋๋ก ํ์ํจ
for j in road[check]:
// ์ด๋ฏธ ํ์์ด ์ด๋ฃจ์ด์ง ์ ์ ์ด ์๋ ๊ฒฝ์ฐ
if lst[j] == M+1:
que.append(j)
lst[j] = lst[check] + 1
if K in lst:
for i in range(1, N+1):
if lst[i] == K:
print(i)
else:
print(-1)
๐ฉโ๐ปcode ๋ถ์
๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ์ ๋ํ ์ ๋ ฅ์์ ์ด์ค ๋ฆฌ์คํธ road์ ์ ์ฅ๋๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
[[], [2, 3], [3, 4], [], []]
-
์ฆ, ์์์ ์ index ๊ฐ์ ์์์ ์ผ๋ก ๋ถํฐ ๊ฐ ์ ์๋ ์ ์ ๋ค์ด ์ ์ฅ๋๋ค.
-
deque๋ฅผ ์ฌ์ฉํด์ ๋๋น ์ฐ์ ํ์์ ์งํํ๋ค. ๊ทธ ๊ณผ์ ์ ์ด์ง ์ดํด๋ณด์!
-
์์์ 1์ด ํ์์ ๋์์ผ ๊ฒฝ์ฐ
-
leftpop()์ผ๋ก ์ธํด 2๊ฐ ํ์์ ๋์์ผ ๊ฒฝ์ฐ
- 3์ ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก 4๋ง deque์ ๋ฃ๋๋ค.
-
๐ฉ ์ด๋ฒ ์๊ณ ๋ฆฌ์ฆ์ ํ์ด๋ ๋น๊ต์ ๊ฐ๋จํ์ง๋ง ํ์๋ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
์ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ ๋, deque๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋์ lst์ index๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ๋ฐ๋ก ๋ ์ผ๋ก์จ ํ์์ ๋์์ ์ ์ ํ์๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ฌ๋ ค ๋ฒ์ ์๊ฐ์ด๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค..ใ ใ
์ฌ์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ ์ตํ๊ณ ํ์ํ ๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค!!
์ด๋ฒ ํฌ์คํธ๋ ์ฌ๊ธฐ์
์ด๋ง!
๋! ~(หโพห~)
๐์ฐธ๊ณ
- https://steadily-worked.tistory.com/646
- https://devuna.tistory.com/32
๋๊ธ๋จ๊ธฐ๊ธฐ