Coding Test

SWEA-5105 : [파이썬 S/W 문제해결 기본] 6일차 - 미로의 거리

일시불

문제

  • SWEA-5105 : [파이썬 S/W 문제해결 기본] 6일차 - 미로의 거리

풀이

Queue를 배우는 단계라서 바로 BFS를 떠올리면 쉽게 해결이 가능하다. 처음에 단순히 queue만을 가지고 해결하려고 하면 실수할 수 있다.

 def isSafe(i, j):
    return -1 < i < mazesize and -1 < j < mazesize and maze[i][j] != 1


T = int(input())
for test_case in range(1, T + 1):
    mazesize = int(input())

    maze = []
    for i in range(mazesize):
        maze.append(list(map(int, ''.join(input().split()))))

    for i in range(mazesize):
        for j in range(mazesize):
            if maze[i][j] == 2:
                xs, ys = [i, j]

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

    queue = [[xs, ys]]
    visit = [[0]*mazesize for _ in range(mazesize)]
    visit[xs][ys] = 1
    dist = [[0]*mazesize for _ in range(mazesize)]
    result = 0
    while queue:
        curr = queue.pop(0)
        for dir in range(4):
            ddx = dx[dir]
            ddy = dy[dir]
            if isSafe(curr[0]+ddx, curr[1]+ddy) and visit[curr[0]+ddx][curr[1]+ddy] == 0:
                if maze[curr[0]+ddx][curr[1]+ddy] == 3:
                    result = dist[curr[0]][curr[1]]
                    break
                queue.append([curr[0]+ddx, curr[1]+ddy])
                visit[curr[0]+ddx][curr[1]+ddy] = 1
                dist[curr[0]+ddx][curr[1]+ddy] = dist[curr[0]][curr[1]] + 1

    print('#%d %d' % (test_case, result))

참고