[BaekJoon] 백준 2665번 : 미로만들기

Updated:

2665번 : 미로만들기


처음 접근할 땐 검은 방을 한 개만 없애는 경우, 두 개만 없애는 경우를 반복해 최소값을 찾아야 하는 줄 알았다.

그러나 너무 경우의 수가 많아지기 때문에 이 방법은 할 수 없다.

흰 방을 무조건 먼저 방문해야하기 때문에 흰 방은 큐 맨 앞에, 검은 방은 큐 맨 뒤에 넣어주면 된다.


from collections import deque


def BFS(n):
    arr = []
    for _ in range(n):
        arr.append(list(map(int, input())))
    visit = [[False for _ in range(n)] for _ in range(n)]
    dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]]

    queue = deque([[0, 0, 0]])
    visit[0][0] = True
    while queue:
        now_i, now_j, dark_room = queue.popleft()
        if now_i == n - 1 and now_j == n - 1:
            return dark_room

        for val in dirs:
            visit_i, visit_j = now_i + val[0], now_j + val[1]
            if 0 <= visit_i < n and 0 <= visit_j < n and not visit[visit_i][visit_j]:
                # 1. 검은 방인 경우 지나온 검은방 개수를 늘린 뒤 append
                if arr[visit_i][visit_j] == 0:
                    queue.append([visit_i, visit_j, dark_room + 1])
                # 2. 흰 방인 경우 먼저 방문하기 위해 appendleft
                else:
                    queue.appendleft([visit_i, visit_j, dark_room])
                visit[visit_i][visit_j] = True


def solution():
    n = int(input())

    return BFS(n)


if __name__ == "__main__":
    print(solution())



Categories:

Updated:

Leave a comment