Algorithm/BFS

[프로그래머스 PCCP 모의고사 4번] 보물 지도

킹우현 2023. 11. 11. 16:43

from collections import deque

def solution(n, m, hole):
    
    dx = [-1,1,0,0]
    dy = [0,0,-1,1]
    
    area = [[0]*n for _ in range(m)]
    visited = [[[-1]*n for _ in range(m)] for _ in range(2)]
    
    for hx, hy in hole:
        area[hy-1][hx-1] = -1
    
    area[0][0],area[m-1][n-1] = 1, 2
    
    def bfs():
        visited[0][0][0] = 0
        
        queue = deque([(0,0,0)])
        
        while queue:
            w, x, y = queue.popleft()
            
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                
                nx_2 = x + dx[i]*2
                ny_2 = y + dy[i]*2
                
                if 0 <= nx < m and 0 <= ny < n:
                    # 함정이 아니고, 아직 방문하지 않은 경우
                    if area[nx][ny] != -1 and visited[w][nx][ny] == -1:
                        visited[w][nx][ny] = visited[w][x][y] + 1
                        queue.append((w,nx,ny))
                    # 다음 칸은 함정이지만 다다음칸은 함정이 아닌 경우
                    elif w == 0 and 0 <= nx_2 < m and 0 <= ny_2 < n and area[nx_2][ny_2] != -1 and visited[1][nx_2][ny_2] == -1:
                        visited[1][nx_2][ny_2] = visited[w][x][y] + 1
                        queue.append((1,nx_2,ny_2))
    bfs()
                     
    if visited[0][m-1][n-1] == -1 and visited[1][m-1][n-1] == -1:
        return -1
    elif visited[0][m-1][n-1] != -1 and visited[1][m-1][n-1] != -1:
        return min(visited[0][m-1][n-1], visited[1][m-1][n-1])
    else:
        return max(visited[0][m-1][n-1], visited[1][m-1][n-1])

 

 

'Algorithm > BFS' 카테고리의 다른 글

[SWEA - D4] 보급로  (0) 2023.11.19
[프로그래머스 PCCP 모의고사 2-2번] 시추관  (0) 2023.11.18
[백준 2589번] 보물섬  (0) 2023.10.20
[백준 7562번] 나이트의 이동  (0) 2023.10.18
[백준 1697번] 숨바꼭질  (0) 2023.10.03