DFS/BFS - 게임 맵 최단거리

송다은·2024년 10월 12일
from collections import deque

def solution(maps):
    answer = 0
    q=deque()
    #maps의 [0][0]에서 출발하고 [n][m]에 도착 행은 가로(+가 오른쪽 -왼쪽) 열은 세로 (+가 아래 -가 위)
    #도착할 수 없는 경우 -1을 리턴하도록 하기 
    n = len(maps) #행의 개수
    m = len(maps[0]) #열의 개수
    
    visited = [[False] * m for _ in range(n)] # 방문했던 곳인지 확인
    q.append((0,0)) #줄발점
    dx = [-1,1,0,0] # 상하좌우
    dy = [0,0,-1,1]
    
    while q:
        y,x = q.popleft()
        for i in range(4): #상하좌우 네 방향 탐색하기
            nx = x + dx[i] #새로운 x좌표 이동 후
            ny = y + dy[i] #새로운 y좌표 이동 후
            if 0 <=nx < m and 0 <= ny < n and maps[ny][nx] == 1 : 
                # 범위 내에 있고 이동 가능한 곳이라면, 
                if not visited[ny][nx]:
                    visited[ny][nx] = True  # 방문 처리
                    q.append((ny, nx))  # 다음 탐색할 좌표로 추가
                    maps[ny][nx] = maps[y][x] + 1  # 이전 좌표까지의 거리 + 1로 갱신
    
    if maps[n-1][m-1] ==1:
        return -1
    else:
        return maps[n-1][m-1]
    return answer

이 풀이는 다른 풀이를 참고하여 작성한 것입니다. (거의 주석만 제가 달았다고 보면 됩니다...)

keypoint

  • visited 배열을 만들어 탐색한 곳은 안가게 하는 것
  • q에 가볼 수 있는 곳들을 넣어두고 하나하나씩 탐색하기 (여기가 BFS부분)
  • 직접 +,-로 빼거나 더하는 연산을 하지 않고 움직임을 배열로 만들어서 (상하좌우 : 00-1+1) 탐색하기

=> 아직도 어렵지만 탐색할 때 어떻게 생각을 해야할지 느낌을 알 것 같고 다른 코드를 분석하는 것만으로도 실력이 향상하는 것 같다!!

profile
Anomaly Detection, AI Security, Multimodal

0개의 댓글