백준 2665번 미로 만들기 G4
문제
n×n 바둑판 모양으로 총 n^2개의 방이 있다. 일부분은 검은 방이고 나머지는 모두 흰 방이다. 검은 방은 사면이 벽으로 싸여 있어 들어갈 수 없다. 서로 붙어 있는 두 개의 흰 방 사이에는 문이 있어서 지나다닐 수 있다. 윗줄 맨 왼쪽 방은 시작방으로서 항상 흰 방이고, 아랫줄 맨 오른쪽 방은 끝방으로서 역시 흰 방이다. 시작방에서 출발하여 길을 찾아서 끝방으로 가는 것이 목적인데, 아래 그림의 경우에는 시작방에서 끝 방으로 갈 수가 없다. 부득이 검은 방 몇 개를 흰 방으로 바꾸어야 하는데 되도록 적은 수의 방의 색을 바꾸고 싶다. 검은 방에서 흰 방으로 바꾸어야 할 최소의 수를 구하는 프로그램을 작성하시오. 단, 검은 방을 하나도 흰 방으로 바꾸지 않아도 되는 경우는 0이 답이다.
입력
첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.
출력
첫 줄에 흰 방으로 바꾸어야 할 최소의 검은 방의 수를 출력한다.
우선순위 큐를 사용한 데이크스트라 알고리즘으로 풀이하였다.
가장 적게 벽을 부순 위치를 우선순위를 높게 판별하였다.
우선순위 큐에서 꺼낸 정점이 끝방이라면 해당 값을 출력하고 종료한다.
더보기
import heapq
import sys
n = int(sys.stdin.readline())
maze_string = list(sys.stdin.readline().rstrip() for _ in range(n))
move_list = [[0,-1],[0,1],[1,0],[-1,0]]
hq = [(0,0,0)]
visit = [[False] * n for _ in range(n)]
while hq:
breakTime, y, x = heapq.heappop(hq)
if y == n-1 and x == n-1: break
if visit[y][x]: continue
visit[y][x] = True
for ay, ax in move_list:
dy, dx = y+ay, x+ax
if dy<0 or dx<0 or dy>=n or dx>=n: continue
if visit[dy][dx]: continue
heapq.heappush(hq, (breakTime+1 if maze_string[dy][dx] == "0" else breakTime, dy, dx))
print(breakTime)
'알고리즘 문제 풀이 > 항해99 코테 스터디' 카테고리의 다른 글
[99클럽/파이썬 챌린저/17일차] 작업 (0) | 2024.11.13 |
---|---|
[99클럽/파이썬 챌린저/16일차] 비슷한 단어 (0) | 2024.11.13 |
[99클럽/파이썬 챌린저/14일차] 미로 탈출 명령어 (0) | 2024.11.11 |
[99클럽/파이썬 챌린저/13일차] 미로 보수 (0) | 2024.11.09 |
[99클럽/파이썬 챌린저/12일차] 도넛과 막대 그래프 (0) | 2024.11.09 |