게임 맵 최단거리

zzwwoonn·2022년 7월 12일
0

Algorithm

목록 보기
70/71

BFS 정석? 같은 문제였다. 첫 제출에 바로 정답이 나왔다.
큐에 appendleft를 해서 계속 틀리게 나왔는데 append를 해야 오른쪽에 계속 추가가 되므로 정상적으로 로직이 돌아간다.

정답 코드

from collections import deque

def solution(maps):
    answer = 0

    # BFS 함수 정의
    def bfs(i, j, maps):
        answer = 0
        n = len(maps)
        # 로우 길이, 5
        m = len(maps[0])
        # 컬럼 길이, 5

        visited = [[0] * m for _ in range(n)]
        # print(visited)

        dx = [1, 0, -1, 0]
        dy = [0, 1,  0, -1]
        # 오른쪽, 아래쪽, 왼쪽, 위쪽

        queue = deque()
        queue.appendleft(((i,j), 1))
        # 현재 노드를 방문 처리

        visited[i][j] = 1
        
        # 큐가 빌 때까지 반복
        while queue:
            # input()

            # 큐에서 하나의 원소를 뽑아 출력
            item, answer = queue.popleft()
            row, col = item
            # print("row = ", row, " col = ", col)

            if row == n-1 and col == m-1:
                return answer
                
            for i in range(4):
                nx = col + dx[i]
                ny = row + dy[i]

                if nx < 0 or ny < 0 or nx >= m or ny >= n:
                    continue

                if visited[ny][nx] == 0 and maps[ny][nx] == 1:
                    visited[ny][nx] = 1
                    queue.append(((ny, nx), answer+1))
            # print("queue = ", queue)
        return -1

    answer = bfs(0, 0, maps)
    
    return answer

주석 제거

from collections import deque

def solution(maps):
    answer = 0

    # BFS 함수 정의
    def bfs(i, j, maps):
        answer = 0
        n = len(maps)
        # 로우 길이, 5
        m = len(maps[0])
        # 컬럼 길이, 5

        visited = [[0] * m for _ in range(n)]
        # print(visited)

        dx = [1, 0, -1, 0]
        dy = [0, 1,  0, -1]

        queue = deque()
        queue.appendleft(((i,j), 1))

        visited[i][j] = 1
        
        while queue:
            item, answer = queue.popleft()
            row, col = item

            if row == n-1 and col == m-1:
                return answer
                
            for i in range(4):
                nx = col + dx[i]
                ny = row + dy[i]

                if nx < 0 or ny < 0 or nx >= m or ny >= n:
                    continue

                if visited[ny][nx] == 0 and maps[ny][nx] == 1:
                    visited[ny][nx] = 1
                    queue.append(((ny, nx), answer+1))
        return -1

    answer = bfs(0, 0, maps)
    
    return answer

0개의 댓글