1 분 소요

1. 문제

https://www.acmicpc.net/problem/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


2. 핵심 아이디어


3. Python 문제풀이

import sys
from heapq import heappush, heappop
input = sys.stdin.readline

n = int(input())
room = []

for _ in range(n) :
  room.append(list(map(int, input().rstrip())))
visited = [[0] * n for _ in range(n)]

def dijkstra() :
  dx = [1, -1, 0, 0]
  dy = [0, 0, -1, 1]
  heap = []
  heappush(heap, [0, 0, 0])
  visited[0][0] = 1
  while heap :
    a, x, y = heappop(heap)
    if x == n - 1 and y == n - 1 :
      print(a)
      return
    for i in range(4) :
      nx = x + dx[i]
      ny = y + dy[i]
      if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0 :
        visited[nx][ny] = 1
        if room[nx][ny] == 0 :
          heappush(heap, [a+1, nx, ny])
        else :
          heappush(heap, [a, nx, ny])

dijkstra()


4. Java 문제풀이


댓글남기기