2178๋ฒ: ๋ฏธ๋ก ํ์
์ฒซ์งธ ์ค์ ๋ ์ ์ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์ ์๋ก ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
www.acmicpc.net
์ค๋ช

์ ์ฌ์ง์ ๋ฏธ๋ก๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. 1์ ์ด๋ํ ์ ์๋ ์นธ์ด๊ณ , 0์ ์ด๋ํ ์ ์๋ ์นธ์ด๋ค. Start์นธ์์ End์นธ๊น์ง ๊ฐ์ผํ๋๋ฐ, ์ง๋๊ฐ ์ ์๋ ์ต์์ ์นธ์ ๊ตฌํ๋ฉด ๋๋ค. ์ฃผํฉ์ ํ๊ด์ผ๋ก ์น ํ ๊ณณ์ด ์ง๋๊ฐ ์ ์๋ ์ต์ ์นธ ๊ฐ์๋ฅผ ์ผ ๊ฒ์ด๋ค. ์นธ ๊ฐ์๋ฅผ ์ ๋ ์์์นธ๊ณผ ๋ง์ง๋ง์นธ๋ ํฌํจ๋๋ค. ๊ทธ๋ผ ์ด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์!
ํ์ด
BFS ์ด์ฉ
1. ํ์ด์ฌ์์ BFS๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ํ๊ฐ ํ์ํ๋ค. ๋ฐ๋ผ์ ํ๋ฅผ ๋ง๋ ๋ค.
ํ์ด์ฌ ๋ฑ ๋ชจ๋ ๋ด์ ์คํ๊ณผ ํ๊ฐ ๋ด์ฅ๋ผ ์์ด์ ์ฌ์ฉํ๊ธฐ ํธํ ๋ฑ ๋ชจ๋์ ๊ฐ์ ธ์จ๋ค.
from collections import deque
import sys
input = sys.stdin.readline #์
์ถ๋ ฅ ํฅ์
2. ๋ฏธ๋ก๋ฅผ ํํํ๊ธฐ ์ํด ์ด์ค ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
N, M = map(int, input().split()) #N = ํ, M = ์ด
graph = []
for _ in range(N): #ํ
#์ด์ค ๋ฆฌ์คํธ ์์ฑ
graph.append(list(map(int, input().rstrip()))) #rstrip() = ๋ง์ง๋ง ๊ฐํ ๋ฌธ์ ์ ๊ฑฐ
#๋ฆฌ์คํธ๊ฐ ์ ๋ง๋ค์ด์ก๋์ง ํ์ธ์ฉ์ผ๋ก ์ถ๋ ฅ
for i in range(N):
print(graph[i])

graph๋ผ๋ ๋ฆฌ์คํธ๋ฅผ ํ๋ ๋ง๋ค๊ณ graph ์์ ๋ ๋ค๋ฅธ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ค๋ค. ์ ๋ ฅ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ ์์ ์ง์ด๋ฃ๊ณ ๊ทธ ๋ฆฌ์คํธ๋ฅผ graph ๋ฆฌ์คํธ์ ๋ค์ ์ง์ด๋ฃ๋๋ก ๋ง๋ค์๋ค.
๋ฆฌ์คํธ๊ฐ ์ ๋ง๋ค์ด์ก๋์ง ํ์ธํด๋ณด๋ฉด(์ถ๋ ฅ ๊ฒฐ๊ณผ) ๋ฌธ์ ์์์ ๋๊ฐ์ด ๋ฏธ๋ก๊ฐ ํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
3. ๋ฏธ๋ก๋ฅผ ํ์ํ ๋ ์ง๋๊ฐ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํ ๋ณ์ dx, dy ์์ฑ
BFS ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ธฐ ์ ์ ํ์ํ ๋ณ์๊ฐ ์๋ค. (BFS ํจ์ ๋ด์์ ํด๋ ๋์ง๋ง ํธ์์ ๋จผ์ ์ ์)

๋ง์ฝ 3x3 ๋ฏธ๋ก(์ข์ธก ๊ทธ๋ฆผ)๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. (0, 0)์์ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ธ์ง ํ์ธํ๊ธฐ ์ํด์๋ ํ์ฌ์์น์์ ์ฃผ๋ณ์ ๋ค ํ์ธํด๋ด์ผ ํ๋๋ฐ, ๋ฌธ์ ์์ ์ธ์ ํ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค๊ณ ํ์ผ๋ฏ๋ก ๋๊ฐ์ ์ ์ ์ธํ ์ํ์ข์ฐ๋ง ํ์ธํด๋ณด๋ฉด ๋๋ค.
ํ์ธํ๋ ๋ฐฉ๋ฒ์ ํ์ฌ ์์น์์ ๋ค๋ฅธ ์์น๋ก ์ด๋ํ๋ฉด์ ํด์ผ ํ๋ค. ์ํ์ข์ฐ 4๊ฐ์ ๋ฐ์ดํฐ๋ง ํ์ํ๋ฏ๋ก x, y ๋ณ์์ ๊ฐ ๋ค ๊ฐ์ ๊ฐ๋ง ๋ฃ๋๋ค. ๋งจ ์ฐ์ธก์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ขํ๋ก ๋ํ๋ธ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ด๋ ํ์ฌ ์์น์์ ํ ์นธ์ ์ด๋ํ์ ๋์ ์ขํ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. ๊ทธ๋ผ dx์ x์ขํ๋ง ์ ์ฅํ๋ฉด ๋๋ฏ๋ก [(์ข)-1, (์ฐ)1, (์)0, (ํ)0], ๊ทธ๋ฆฌ๊ณ dy์๋ y์ขํ์ธ [(์ข)0, (์ฐ)0, (์)1 (ํ)-1] ์ด๋ ๊ฒ ์ ์ฅํ๋ค. ํ์๋ ์ข์ฐํ์ ์๋๋ก ์ ์ฅํ์ง๋ง, ๋ณธ์ธ์ด ํธํ ์์๋๋ก ์ ์ฅํ๋ฉด ๋๋ค. (๋จ x์ y ๋ชจ๋ ์์์ ๋ง๊ฒ ์ ์ฅํด์ผ ํ๋ค. ์ฆ, x๋ ์ข์ฐํ์์ธ๋ฐ y๋ ์ข์ฐ์ํ ์ด๋ฐ์์ผ๋ก ์ ์ฅํ๋ฉด ์ ๋๋ค๋ ๊ฒ์ด๋ค.)
#์ํ์ข์ฐ๋ฅผ ๋ค ํ์ธํ๊ธฐ ์ํ ๊ฑธ ์ถ๊ฐ (์๋๋ ์ข์ฐ์ํ ์๋๋ก ์ ์ฅ)
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
4. BFS ๊ตฌํ
def BFS(x, y):
q = deque() #๋ฑ ์์ฑ
q.append((x, y)) #์ด๊ธฐ ์์น
ํ์ด์ฌ์์๋ ํจ์๋ฅผ ์ ์ํ๋ ค๋ฉด def๋ฅผ ์ฐ๋ฉด ๋๋ค. BFS ํจ์ ์ธ์์ ์ขํ๊ฐ(0, 0)์ ๋ฃ์ด์ผ ํ๋ฏ๋ก x์ y๋ฅผ ์ด๋ค. ๋ค์์ผ๋ก๋ ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฑ์ ์์ฑํ๋ค. ๋ฑ์ ์ด๋ฆ์ q๋ผ๊ณ ์ ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐ ์์น๋ฅผ q์ ๋ฃ๋๋ค.
while q:
x, y = q.popleft() # ๊บผ๋ด๊ธฐ
# ์ข์ฐ์ํ์ ๊ธธ์ด ์๋์ง ์ขํ ์ด๋ํ๋ฉด์ ํ์ธ
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
์ด์ ์ขํ๋ฅผ ์ด๋์ํค๋ฉด์ ๊ธธ์ ์ฐพ๋๋ค. popleft()๋ ๋ฑ์ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๊ฑธ ๋นผ๋ด๊ณ ์ญ์ ํ๋ค. ๋ฑ์ ์๋ ํ์ฌ ์ขํ๋ฅผ ๊บผ๋ด์ x, y์ ์ ์ฅํ๋ค. ๋ค์์ผ๋ก๋ ํ์ฌ ์ขํ์์ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ค.
# ๋ฏธ๋ก ๋ฐ์ผ๋ก ๋ฒ์ด๋๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฒ์ด๋๋ฉด ๋ฌด์ํ๋ค.
if nx < 0 or nx >= N or ny < 0 or ny >= M:
continue
๊ทธ๋ฌ๋ ๋ฏธ๋ก ๋ฐ์ผ๋ก ๋ฒ์ด๋ ์๋ ์๋ค. ์์ ๊ทธ๋ฆผ(3๋ฒ)์์ ํ์ฌ ์ขํ๊ฐ (0, 0) ์ผ ๋ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ฉด Xํ์ ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ๊ทธ๊ฑด ๋ฏธ๋ก ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์๋ค๊ณ ํ์ํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ฏธ๋ก๋ฅผ ๋ฒ์ด๋๋ฉด ๋ฌด์ํ๋ ์ฝ๋๋ฅผ ๋ฃ์ด์คฌ๋ค.
# ๊ธธ(1)์ด ๋ฐ๊ฒฌ๋๋ฉด ํด๋น ์นธ์ผ๋ก ์ขํ ์ด๋
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1 #์ด๋ํ ์ ์๋ ์นธ์ ๊ฐ์ ์นด์ดํธ
q.append((nx, ny)) # ์ด๋๋ nx, ny๋ฅผ queue์ ์ง์ด ๋ฃ๊ธฐ
์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ค๊ฐ ๊ธธ(1)์ด ๋ฐ๊ฒฌ๋๋ฉด ํด๋น ์นธ์ผ๋ก ์ด๋ํ๋ค. ๋ง์ฝ ํ์ฌ ์ขํ๊ฐ (0, 0)์ผ ๋ graph[0][0]์ด๊ณ ์ด ๊ฐ์ ํ์ฌ 1์ด๋ค. ์ฌ๊ธฐ์ 1์ ๋ํด์ ์นธ์ ๊ฐ์๋ฅผ ์ผ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋๋ ์ขํ๋ฅผ ๋ค์ ํ์ ๋ฃ๋๋ค. ์ด๋๋ ์ขํ๊ฐ ํ์ฌ ์์น๊ฐ ๋๋ค.
์ํ์ข์ฐ๋ฅผ ๋ค ํ์ธํ์ผ๋ฉด ๋ค์ ํ์์ ํ์ฌ ์์น๋ฅผ ๊บผ๋ด์ End์นธ์ ๋์ฐฉํ ๋๊น์ง ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
return graph[N - 1][M - 1] # ์ต์ข
n, m ์์น์์์ graph ๊ฐ ์ฆ, ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํํจ
while๋ฌธ์ด ๋๋ฌ์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค. ์ด๋ํ ์นธ์ ๊ฐ์๋ฅผ ํ์ธํ๋ ค๋ฉด graph์ End์นธ์ ์์น๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. ์๋์ ์ ์ฒด ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก ํ์ธํด๋ณด์.
Solution (์ ์ฒด ์ฝ๋)
import sys
input = sys.stdin.readline #์
์ถ๋ ฅ ํฅ์
from collections import deque
N, M = map(int, input().split())
graph = []
for _ in range(N):
graph.append(list(map(int, input())))
#์ข์ฐ์ํ
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
def BFS(x, y):
q = deque() #ํ ์์ฑ
q.append((x,y)) # x = 0, y = 0 -> deque([(0, 0)])
while q:
x, y = q.popleft() # x = 0, y = 0 -> (0, 0)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= M:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
q.append((nx, ny))
return graph[N-1][M-1]
print(BFS(0, 0)) #๊ฒฐ๊ณผ ์ถ๋ ฅ
โง 2023-02-19 20:44 -> 23.05.13 ํ์ด ์ค๋ช ์ฌ์์
'๐งฉ Algorithm > [BOJ] Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| BOJ 7568๋ฒ : ๋ฉ์น (Python/Silver 5) (0) | 2023.09.04 |
|---|---|
| BOJ 2667๋ฒ : ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (Python/Silver 1) (0) | 2023.05.16 |
| BOJ 15651๋ฒ : N๊ณผ M (3) (Python/Silver 3) (0) | 2023.05.11 |
| BOJ 11725๋ฒ : ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ (Python/Silver 2) (0) | 2023.05.09 |
| BOJ 9012๋ฒ : ๊ดํธ (Python/Silver 4) (0) | 2023.05.03 |