DFS/BFS - 게임 맵 최단거리 (Level 2)

jisu_log·2025년 3월 24일

알고리즘 문제풀이

목록 보기
9/105


2차원 배열 상에서 최단거리 구하기 -> queue를 활용한 BFS

from collections import deque

def bfs(x, y, maps, n, m):
    
    q = deque()
    q.append((x, y)) # 시작위치 (0, 0) 넣기
    
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
    
    while q: # queue가 비어있지 않는 동안 계속 반복 (비어있게 된다는 것은 더 이동할 수 있는 곳이 없다는 의미이므로 종료)
        x, y = q.popleft() # queue(다음에 방문해야 할 좌표 누적되어있음)에서 선입선출함
        
        for i in range(4): # 상하좌우 모두 고려함
            nx = x + dx[i] 
            ny = y + dy[i]
        
            if nx < 0 or ny < 0 or nx >= n or ny >= m: # 맵을 벗어나면 패스
                continue
            if maps[nx][ny] == 0: # 벽이면 못가서 패스
                continue
            if maps[nx][ny] == 1: # 갈 수 있는데 아직 방문 안한 곳이라면 감
                maps[nx][ny] = maps[x][y] + 1 # 방문한 곳에 현재까지 거리 + 1해서 누적 거리 표시
                q.append((nx, ny)) # 다음에 방문하기 위해 queue에 넣어줌
                
    return maps[n - 1][m - 1] # 상대 팀 진영 칸에 적힌 숫자가 최단 거리이므로                          
                                        
                                        
def solution(maps):
    answer = 0
    
    n = len(maps) # maps의 행 크기
    m = len(maps[0]) # maps의 열 크기

    answer = bfs(0, 0, maps, n, m)
    
    if answer == 1: # 만약 상대 팀 진영에 도달하지 못했다면 해당 칸에 1이 써있을 것이므로
        answer = -1 # -1 리턴하기
        
    return answer

0개의 댓글