π Development/Problem Solving
[νλ‘κ·Έλλ¨Έμ€] κ²μ λ§΅ μ΅λ¨κ±°λ¦¬(Lv.2) - νμ΄μ¬(Python)
Jay Din
2024. 9. 5. 20:35
728x90
λ°μν
λ¬Έμ
https://school.programmers.co.kr/learn/courses/30/lessons/1844
νλ‘κ·Έλλ¨Έμ€
μ½λ μ€μ¬μ κ°λ°μ μ±μ©. μ€ν κΈ°λ°μ ν¬μ§μ λ§€μΉ. νλ‘κ·Έλλ¨Έμ€μ κ°λ°μ λ§μΆ€ν νλ‘νμ λ±λ‘νκ³ , λμ κΈ°μ κΆν©μ΄ μ λ§λ κΈ°μ λ€μ λ§€μΉ λ°μΌμΈμ.
programmers.co.kr
νμ΄
μ΄ μ½λλ μ£Όμ΄μ§ 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
λ°μν