티스토리 뷰

728x90

https://programmers.co.kr/learn/courses/30/lessons/1844

 

코딩테스트 연습 - 게임 맵 최단거리

[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

programmers.co.kr

 

  • 해설 :

NxN의 2차원 배열의 (0,0) 지점에서 시작하는 사람이 벽으로 막히지 않은 길을 따라 최종 목적지인 (N-1,N-1)까지 도달하려 할 때, 최단거리로 도착할 수 있는 거리를 출력하는 문제이다.

 

 

 

 

  • 풀이 :

BFS나 DFS를 사용하는 문제이다. 나는 BFS가 더 익숙해서 BFS로 해결하였다. 시작점에서부터 노드들을 탐색하는데 이미 탐색한 노드인 경우 더이상 진행하지 않게끔 구현하였다. 그 이유는 이미 탐색한 경우 무조건 현재 경로로 가는 것보다 더 빠른 경로이기 때문이다. (bfs로 한 칸씩 전진하기 때문)

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from collections import deque
 
dx = [-1,1,0,0]
dy = [0,0,-1,1]
 
def solution(maps):
    answer = 0
    l1 = len(maps[0])
    l2 = len(maps)
    c = [[10001 for _ in range(l1)] for _ in range(l2)]
    c[0][0= 1
    queue = deque()
    queue.append([0,0])    
    while queue:
        x,y = queue.popleft()
        for i in range(4):
            ax = x + dx[i]
            ay = y + dy[i]
            if 0 <= ax < l2 and 0 <= ay < l1:
                if maps[ax][ay] == 1 and c[ax][ay] == 10001:
                    queue.append([ax,ay])
                    c[ax][ay] = min(c[ax][ay],c[x][y]+1)
    
    return c[-1][-1if c[-1][-1!= 10001 else -1
cs
320x100
댓글
© 2022 WonSeok, All rights reserved