❇️오늘의 학습 키워드 : 미로만들기(백준 #2665)
문제
n×n 바둑판 모양으로 총 n2개의 방이 있다. 일부분은 검은 방이고 나머지는 모두 흰 방이다. 검은 방은 사면이 벽으로 싸여 있어 들어갈 수 없다. 서로 붙어 있는 두 개의 흰 방 사이에는 문이 있어서 지나다닐 수 있다. 윗줄 맨 왼쪽 방은 시작방으로서 항상 흰 방이고, 아랫줄 맨 오른쪽 방은 끝방으로서 역시 흰 방이다.
시작방에서 출발하여 길을 찾아서 끝방으로 가는 것이 목적인데, 아래 그림의 경우에는 시작방에서 끝 방으로 갈 수가 없다. 부득이 검은 방 몇 개를 흰 방으로 바꾸어야 하는데 되도록 적은 수의 방의 색을 바꾸고 싶다.
아래 그림은 n=8인 경우의 한 예이다.

위 그림에서는 두 개의 검은 방(예를 들어 (4,4)의 방과 (7,8)의 방)을 흰 방으로 바꾸면, 시작방에서 끝방으로 갈 수 있지만, 어느 검은 방 하나만을 흰 방으로 바꾸어서는 불가능하다. 검은 방에서 흰 방으로 바꾸어야 할 최소의 수를 구하는 프로그램을 작성하시오.
단, 검은 방을 하나도 흰방으로 바꾸지 않아도 되는 경우는 0이 답이다.
입력
첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.
출력
첫 줄에 흰 방으로 바꾸어야 할 최소의 검은 방의 수를 출력한다.
예제 입력 1
8
11100110
11010010
10011010
11101100
01000111
00110001
11011000
11000111
예제 출력 1
2
정답 코드
import heapq
n = int(input())
arr = [list(map(int, list(input().strip()))) for _ in range(n)]
# distance 배열: 각 칸에 도달하기 위해 최소 몇 개의 검은 방을 흰 방으로 바꾸어야 하는지 기록
distance = [[float('inf')] * n for _ in range(n)]
# 우선순위 큐 초기화
q = []
heapq.heappush(q, (0, 0, 0)) # (변경된 검은 방의 개수, y, x)
distance[0][0] = 0
# 방향 벡터
directions = [(0, -1), (0, 1), (1, 0), (-1, 0)]
def dijkstra():
while q:
cnt, y, x = heapq.heappop(q)
# 현재 위치가 도착 지점인 경우 최소 검은 방 변경 개수 반환
if y == n - 1 and x == n - 1:
return cnt
# 현재 위치의 변경 개수가 기록된 최소 변경 개수보다 큰 경우 무시
if cnt > distance[y][x]:
continue
# 인접한 칸으로 이동
for dy, dx in directions:
ny, nx = y + dy, x + dx
if 0 <= ny < n and 0 <= nx < n:
# 다음 칸이 흰 방이면 cnt 유지, 검은 방이면 cnt + 1
next_cnt = cnt if arr[ny][nx] == 1 else cnt + 1
# 다음 칸의 최소 변경 개수를 갱신하는 경우에만 큐에 추가
if next_cnt < distance[ny][nx]:
distance[ny][nx] = next_cnt
heapq.heappush(q, (next_cnt, ny, nx))
# 결과 출력
print(dijkstra())
❇️오늘의 회고
- 다익스트라를 더 자유자재로 쓸 수 있도록 연습해야겠다...아직 어렵다ㅠㅠ
- 입력받을 때 습관적으로 split()하다가 띄어쓰기가 없다는 것을 뒤늦게 깨달았다...
- 내일 11시, 문제를 풀기 전에 위 문제를 한번 더 복습하고 내일 문제에 사용된 알고리즘에 대해서 공부할 것이다!🙂
'99클럽 코테 스터디' 카테고리의 다른 글
99클럽 코테 스터디 17일차 TIL - 작업(백준 #2056) (2) | 2024.11.13 |
---|---|
99클럽 코테 스터디 16일차 TIL - 비슷한 단어(백준 #2179) (4) | 2024.11.12 |
99클럽 코테 스터디 14일차 TIL - 거스름돈(백준 #14916) (1) | 2024.11.11 |
99클럽 코테 스터디 13일차 TIL - 고양이는 많을수록 좋다(백준 #27961) (0) | 2024.11.09 |
99클럽 코테 스터디 11일차 TIL - 도서관(백준 #1461) (2) | 2024.11.07 |