99클럽 코테 스터디 15일차 TIL - 미로만들기(백준 #2665)

2024. 11. 12. 01:08·99클럽 코테 스터디

❇️오늘의 학습 키워드 : 미로만들기(백준 #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
'99클럽 코테 스터디' 카테고리의 다른 글
  • 99클럽 코테 스터디 17일차 TIL - 작업(백준 #2056)
  • 99클럽 코테 스터디 16일차 TIL - 비슷한 단어(백준 #2179)
  • 99클럽 코테 스터디 14일차 TIL - 거스름돈(백준 #14916)
  • 99클럽 코테 스터디 13일차 TIL - 고양이는 많을수록 좋다(백준 #27961)
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (382)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (2)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    99클럽
    개발자취업
    항해99
    코딩테스트준비
    Til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
99클럽 코테 스터디 15일차 TIL - 미로만들기(백준 #2665)
상단으로

티스토리툴바