728x90
๋ฐ์ํ
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/1844
ํ์ด
์ด ์ฝ๋๋ ์ฃผ์ด์ง maps ์์ BFS(๋๋น ์ฐ์ ํ์)์ ์ฌ์ฉํ์ฌ ์ถ๋ฐ์ (0, 0)์์ ๋์ฐฉ์ (m-1, n-1) ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฝ๋์ ๋๋ค.
๊ฐ ์นธ์์ ๊ฐ ์ ์๋ ๊ฒฝ๋ก๋ 1๋ก ํ์๋๋ฉฐ, 0์ ๋ฒฝ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ ๋๋ค.
1. ๋ณ์ ์ค๋ช ๋ฐ ์ด๊ธฐ ์ค์
m = len(maps) # ํ์ ์
n = len(maps[0]) # ์ด์ ์
- m ์ ๋งต์ ํ(row) ์๋ฅผ ๋ํ๋ด๋ฉฐ, n์ ์ด(column) ์๋ฅผ ๋ํ๋ ๋๋ค. ์ฆ, ๋งต์ m x n ํฌ๊ธฐ์ ๋๋ค.
visited = [[False]*n for _ in range(m)]
- visited๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ 2์ฐจ์ ๋ฆฌ์คํธ์ ๋๋ค.
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
- dx ์ dy ๋ ์ํ์ข์ฐ ์ด๋์ ์ํ ๋ฐฉํฅ์ ๋๋ค. ์ด ๊ฐ๋ค์ ์ด์ฉํด ๊ฐ๊ฐ ์, ์๋, ์ข, ์ฐ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
2. BFS ํจ์ ์ค๋ช
def bfs(x, y):
q = deque()
q.append([x, y])
visited[x][y] = True
- bfs ํจ์๋ (x, y) ์ขํ์์ BFS ํ์์ ์์ํฉ๋๋ค.
- deque๋ ํ ์๋ฃ๊ตฌ์กฐ๋ก, BFS๋ฅผ ์ํํ๊ธฐ์ ์ ํฉํฉ๋๋ค. ์ฒซ ์์์ (0, 0)์ ํ์ ๋ฃ๊ณ visited ๋ฅผ true๋ก ์ค์ ํฉ๋๋ค.
while q:
xx, yy = q.popleft()
- ํ๊ฐ ๋น์ด ์์ง ์์ ๋์ BFS๋ฅผ ์ํํฉ๋๋ค. q.popleft() ๋ ํ์์ ๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ ์ขํ๋ฅผ ๊บผ๋ ๋๋ค.
for i in range(4):
nx = xx + dx[i]
ny = yy + dy[i]
- ์ํ์ข์ฐ๋ก ์ด๋ํ๊ธฐ ์ํด dx, dy ๋ฐฉํฅ์ ์ฌ์ฉํด ์ขํ (nx, ny)๋ฅผ ๊ณ์ฐํฉ๋๋ค.
if 0 <= nx < m and 0 <= ny < n:
if maps[nx][ny] != 0 and not visited[nx][ny]:
visited[nx][ny] = True
maps[nx][ny] = maps[xx][yy] + 1
q.append([nx, ny])
- ์๋ก์ด ์ขํ (ny, nx)๊ฐ ๋งต์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ณ (0 <= nx < m and 0 <= ny < n), ๋ฒฝ์ด ์๋ ๊ณณ(maps[nx][ny] != 0) ์ด๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ ( not visited[nx][ny] ) ์ธ ๊ฒฝ์ฐ์๋ง ์ด๋ํฉ๋๋ค.
- ์ด๋ํ ์ ์์ผ๋ฉด visited[nx][ny] = True๋ก ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ , ๊ทธ ์์น์ ๊ฐ์ ํ์ฌ ์์น maps[xx][yy]์ 1์ ๋ํ ๊ฐ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค. ์ด๋ BFS ํน์ฑ์ ์ต๋จ ๊ฒฝ๋ก์์ ๋ณด์ฅํฉ๋๋ค.
- ์ดํ (nx, ny) ์ขํ๋ฅผ ํ์ ์ถ๊ฐํ์ฌ ๊ณ์ ํ์ํฉ๋๋ค.
3. ์ต์ข ๊ฒฐ๊ณผ ๊ณ์ฐ
if maps[m-1][n-1] == 1 or maps[m-1][n-1] == 0:
answer = -1
else:
answer = maps[m-1][n-1]
- BFS ํ์์ด ๋๋ ํ ๋์ฐฉ์ (m-1, n-1)์ ๊ฐ์ด 1์ด๊ฑฐ๋ 0์ด๋ฉด, ์ด๋ ๊ฒฝ๋ก๊ฐ ์์์ ์๋ฏธํ๋ฏ๋ก answer = -1๋ก ์ค์ ํฉ๋๋ค. 1์ ๋์ฐฉ์ ์ด ์ด๊ธฐ ์ํ์ธ ๊ฒฝ์ฐ์ด๋ฉฐ, 0์ ๋์ฐฉํ ์ ์๋ ๊ฒฝ์ฐ์ ๋๋ค.
- ๋์ฐฉ์ ์ ๊ฐ์ด 1๋ณด๋ค ํฌ๋ฉด, ์ด๋ ์์์ ์์ ๋์ฐฉ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ฏ๋ก, ๊ทธ ๊ฐ์ answer์ ์ ์ฅํฉ๋๋ค.
์ต์ข ์ฝ๋
from collections import deque
def solution(maps):
answer = 0
m = len(maps) # ํ์ ์
n = len(maps[0]) # ์ด์ ์
visited = [[False]*n for _ in range(m)]
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def bfs(x, y):
q = deque()
q.append([x,y])
visited[x][y] = True
while q:
xx, yy = q.popleft()
for i in range(4):
nx = xx+dx[i]
ny = yy+dy[i]
if 0<= nx < m and 0 <= ny < n:
if maps[nx][ny] != 0 and not visited[nx][ny]:
visited[nx][ny] = True
maps[nx][ny] = maps[xx][yy] + 1
q.append([nx, ny])
bfs(0,0)
if maps[m-1][n-1] == 1 or maps[m-1][n-1] == 0:
answer = -1
else:
answer = maps[m-1][n-1]
return answer
728x90
๋ฐ์ํ