여름의 서재

[SWEA] 5105_미로의 거리 본문

알고리즘/SWEA

[SWEA] 5105_미로의 거리

엉아_ 2021. 8. 26. 13:26
728x90

📕 문제

NxN 크기의 미로에서 출발지 목적지가 주어진다.
이때 최소 몇 개의 칸을 지나면 출발지에서 도착지에 다다를 수 있는지 알아내는 프로그램을 작성하시오.
경로가 있는 경우 출발에서 도착까지 가는데 지나야 하는 최소한의 칸 수를, 경로가 없는 경우 0을 출력한다.
다음은 5x5 미로의 예이다. 1은 벽, 0은 통로를 나타내며 미로 밖으로 벗어나서는 안된다.

13101
10101
10101
10101
10021

마지막 줄의 2에서 출발해서 0인 통로를 따라 이동하면 맨 윗줄의 3에 5개의 칸을 지나 도착할 수 있다.


[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다.  1<=T<=50
다음 줄부터 테스트 케이스의 별로 미로의 크기 N과 N개의 줄에 걸쳐 미로의 통로와 벽에 대한 정보가 주어진다. 5<=N<=100
0은 통로, 1은 벽, 2는 출발, 3은 도착이다.

 

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

 

💡 풀이법

1. 시작점인 2의 좌표를 찾아 준다.

2. 거리를 담을 2차 행렬 distance를 만들어 준다.

3. 갈 노드들을 담아줄 q 리스트를 만든다.

4. q에서 앞의 하나를 꺼내서 0이나 2면 maze에 방문 처리를 해준다.

5. 사방으로 갈수 있기 때문에 4번 방향을 바꾸어주며 통로(0)이면 그곳까지 가는데 거치는 칸수를 더해준다.

6. q에 추가해준다.

6. 만약 그곳이 끝점(3)이라면 거리를 반환해준다.

 

def bfs(y, x):
    distance = [[0 for _ in range(N)] for _ in range(N)]
    q = [(y, x)]

    dxy = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 오른쪽, 아래, 왼쪽, 위
    while q:
        y, x = q.pop(0)
        if maze[y][x] == 0 or 2:
            maze[y][x] = 1

            for dy, dx in dxy:
                ny, nx = y + dy, x + dx

                if 0 <= ny <= N-1 and 0 <= nx <= N-1:
                    if maze[ny][nx] == 0:
                        distance[ny][nx] = distance[y][x] + 1
                        q.append((ny, nx))
                    elif maze[ny][nx] == 3:
                        return distance[y][x]
    return 0

T = int(input())
for tc in range(1, T+1):
    N = int(input())
    maze = [list(map(int, list(input()))) for _ in range(N)]
    for i in range(N):
        if 2 in maze[i]:
            sy, sx = i, maze[i].index(2)
            break
    print('#{} {}'.format(tc, bfs(sy, sx)))

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 1226_미로1  (0) 2021.08.26
[SWEA] 5099_피자 굽기  (0) 2021.08.26
[SWEA] 5102_노드의 거리  (0) 2021.08.26
[SWEA] 1224_계산기3 (후위 표기식 이용)  (0) 2021.08.25
[SWEA] 4881_배열 최소 합 (백트랙킹 이용)  (0) 2021.08.24
Comments