Today's keyword : BFS/DFS
๐ ๋ฌธ์ ์ค๋ช
https://www.acmicpc.net/problem/7562

์ด ๋ฌธ์ ๋ ์ฒด์คํ์์ ๋์ดํธ๊ฐ ํน์ ์์น์์ ๋ค๋ฅธ ์์น๋ก ์ด๋ํ๋ ์ต์ ์ด๋ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค. ๋์ดํธ๋ L์ ํํ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, ์ฃผ์ด์ง ์ฒด์คํ์ ํฌ๊ธฐ์ ์์ ๋ฐ ๋ชฉํ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ๋์ดํธ๊ฐ ๋ชฉํ ์์น์ ๋๋ฌํ๊ธฐ ์ํด ํ์ํ ์ต์ ์ด๋ ํ์๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค.
- ์
๋ ฅ
- ์ฒซ ๋ฒ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค T๊ฐ ์ฃผ์ด์ง๋๋ค
- ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ์ฒด์คํ์ ํฌ๊ธฐ(I), ๋์ดํธ์ ์์ ์์น, ๋์ดํธ์ ๋ชฉํ ์์น๊ฐ ์ฃผ์ด์ง๋๋ค.
- ์ถ๋ ฅ : ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ๋์ดํธ๊ฐ ๋ชฉํ ์์น์ ๋๋ฌํ๊ธฐ ์ํ ์ต์ ์ด๋ ํ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๐ ๋ฌธ์ ํ์ด
from collections import deque
T = int(input()) # ํ
์คํธ ์ผ์ด์ค ์ ์
๋ ฅ
for _ in range(T):
I = int(input()) # ์ฒด์คํ์ ํฌ๊ธฐ
x, y = map(int, input().split()) # ์์ ์์น
end_x, end_y = map(int, input().split()) # ๋ชฉํ ์์น
# ๊ทธ๋ํ์ ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ ์ด๊ธฐํ
graph = []
visited = []
for i in range(I):
graph.append([0] * I) # ์ด๋ ํ์๋ฅผ ์ ์ฅํ ๊ทธ๋ํ
visited.append([0] * I) # ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
queue = deque() # BFS๋ฅผ ์ํ ํ
queue.append((x, y)) # ์์ ์์น ํ์ ์ถ๊ฐ
while queue:
x, y = queue.popleft() # ํ์์ ์์น ๊บผ๋ด๊ธฐ
# ๋ชฉํ ์์น์ ๋๋ฌํ ๊ฒฝ์ฐ
if x == end_x and y == end_y:
print(graph[x][y]) # ์ด๋ ํ์ ์ถ๋ ฅ
break
# ๋์ดํธ์ ์ด๋ ๋ฐฉํฅ
move = [(2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (2, -1), (1, -2)]
for dx, dy in move:
nx, ny = x + dx, y + dy # ์๋ก์ด ์์น ๊ณ์ฐ
# ์๋ก์ด ์์น๊ฐ ์ฒด์คํ ๋ฒ์ ๋ด์ ์๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ
if 0 <= nx < I and 0 <= ny < I and not visited[nx][ny]:
graph[nx][ny] = graph[x][y] + 1 # ์ด๋ ํ์ ๊ธฐ๋ก
visited[nx][ny] = 1 # ๋ฐฉ๋ฌธ ํ์
queue.append((nx, ny)) # ํ์ ์ถ๊ฐ
# print(queue)
# print(*graph, sep='\n')
1. ์ ๋ ฅ ์ฒ๋ฆฌ
- ํ ์คํธ ์ผ์ด์ค์ ์ T๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ฒด์คํ์ ํฌ๊ธฐ I, ์์ ์์น (x, y), ๋ชฉํ ์์น (end_x, end_y)๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค.
2. ๊ทธ๋ํ ๋ฐ ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ ์ด๊ธฐํ:
- graph์ visited ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค. graph๋ ๊ฐ ์์น์์ ๋์ดํธ๊ฐ ์ด๋ํ ํ์๋ฅผ ์ ์ฅํ๊ณ , visited๋ ํด๋น ์์น๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
3. BFS ๊ตฌํ:
- BFS(๋๋น ์ฐ์ ํ์)๋ฅผ ์ฌ์ฉํ์ฌ ๋์ดํธ์ ์ด๋์ ํ์ํฉ๋๋ค. BFS๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ ๋ฆฌํ๋ฏ๋ก, ๋์ดํธ๊ฐ ๋ชฉํ ์์น์ ๋๋ฌํ๋ ์ต์ ์ด๋ ํ์๋ฅผ ์ฐพ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- BFS๋ฅผ ์ํด ํ๋ฅผ ์ฌ์ฉํ๊ณ , ์์ ์์น๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
4. ์ด๋ ๊ฐ๋ฅ ์์น ํ์:

- ๋์ดํธ์ ์ด๋ ๋ฐฉ์์ L์ ํํ๋ก ๋ฌธ์ ์์ ์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ 8๊ฐ์ง ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๊ฐ ๋ฐฉํฅ์ ๋ํด ์๋ก์ด ์์น (nx, ny)๋ฅผ ๊ณ์ฐํ๊ณ , ์ด ์์น๊ฐ ์ฒด์คํ์ ๋ฒ์ ๋ด์ ์์ผ๋ฉฐ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ์๋ง ํ์ ์ถ๊ฐํฉ๋๋ค.
- ์ด๋ ํ์๋ฅผ graph[nx][ny]์ ๊ธฐ๋กํ๊ณ , ํด๋น ์์น๋ฅผ ๋ฐฉ๋ฌธํ์์ visited[nx][ny]์ ํ์ํฉ๋๋ค.
5. ๋ชฉํ ์์น ๋๋ฌ ํ์ธ:
- ํ์์ ์์น๋ฅผ ๊บผ๋ด๋ฉด์ ๋ชฉํ ์์น์ ๋๋ฌํ๋์ง ํ์ธํฉ๋๋ค. ๋ชฉํ ์์น์ ๋๋ฌํ๋ฉด ์ด๋ ํ์๋ฅผ ์ถ๋ ฅํ๊ณ , BFS๋ฅผ ์ข ๋ฃํฉ๋๋ค.
์์ ํ์ธ
์ฃผ์์ฒ๋ฆฌ ๋ print ๋ฌธ์ ์ฐ์ด๋ณด๋ฉด ํ๊ฐ ์ด๋ป๊ฒ ์์ด๊ณ ์ด๋ํ์๋ฅผ ์ ์ฅํ graph๊ฐ ์ด๋ป๊ฒ ๊ธฐ๋ก๋๊ณ ์๋์ง ์ ์ ์์ต๋๋ค. I๊ฐ 8์ด๊ณ , ์์์์น๊ฐ (0, 0), ๋ชฉํ์์น๊ฐ (7,0) ์ผ์ด์ค์ ์ฒ์ ์์ง์ด๋ ๊ณผ์ ์ ์๋์ ๊ฐ์ต๋๋ค.

๐ ์ค๋์ ํ๊ณ
BFS๋ฌธ์ ๋ ๋ง์ด ํ์ด์ ์ต์ํด์ง๊ณ ์๋ค.
#99ํด๋ฝ #์ฝ๋ฉํ ์คํธ์ค๋น #๊ฐ๋ฐ์์ทจ์ #ํญํด99 #TIL
