관측 장비 순회
문제
한 연구소가 산지 곳곳에 관측 장비를 설치해 두었다. 이 산지는 N × N 크기의 격자로 나뉘어 있고, 각 칸에는 그 칸의 고도가 적혀 있다.
격자에는 다음의 세 가지 표시가 쓰인다.
(1) P는 드론 격납고가 있는 칸이다. 격자 전체에 정확히 하나 있다. (2) K는 배터리를 갈아 주어야 하는 관측 장비가 있는 칸이다. 하나 이상 있다. (3) 점(.)은 아무것도 없는 빈 칸이다.
드론은 격납고에서 출발하여 모든 관측 장비 칸을 한 번 이상 지난 뒤에 다시 격납고로 돌아와야 한다. 드론은 현재 칸에서 가로, 세로, 대각선으로 맞닿은 여덟 칸 가운데 어디로든 한 번에 옮겨 갈 수 있다. 같은 칸을 여러 번 지나도 된다.
그런데 이 드론은 기압이 급하게 바뀌면 고장이 난다. 그래서 드론이 지나는 칸들 가운데 가장 높은 칸의 고도와 가장 낮은 칸의 고도의 차이를 되도록 작게 만들고 싶다. 출발 지점인 격납고 칸의 고도도 지나는 칸에 들어간다.
산지의 표시와 각 칸의 고도가 주어졌을 때, 드론이 격납고에서 출발해 모든 관측 장비를 거쳐 격납고로 돌아올 수 있는 경로 가운데, 지나는 칸의 최고 고도와 최저 고도의 차이가 가장 작은 값을 계산하는 프로그램을 작성하여라.
예를 들어 N=4인 산지의 표시가 다음의 표와 같다고 해보자.
| 행 | 1열 | 2열 | 3열 | 4열 |
|---|---|---|---|---|
| 1행 | . | . | . | K |
| 2행 | K | P | . | . |
| 3행 | . | . | . | . |
| 4행 | . | K | . | . |
또한 각 칸의 고도는 다음의 표와 같다고 해보자.
| 행 | 1열 | 2열 | 3열 | 4열 |
|---|---|---|---|---|
| 1행 | 45 | 50 | 2 | 35 |
| 2행 | 25 | 20 | 2 | 29 |
| 3행 | 2 | 47 | 17 | 41 |
| 4행 | 13 | 30 | 22 | 38 |
격납고는 2행 2열에 있고 고도는 20이다. 관측 장비는 1행 4열에 고도 35, 2행 1열에 고도 25, 4행 2열에 고도 30으로 세 대가 있다.
드론이 고도가 17 이상 35 이하인 칸만 밟는다고 해보자. 밟을 수 있는 칸을 ○로 표시하면 다음의 표와 같다.
| 행 | 1열 | 2열 | 3열 | 4열 |
|---|---|---|---|---|
| 1행 | ○ | |||
| 2행 | ○ | ○ | ○ | |
| 3행 | ○ | |||
| 4행 | ○ | ○ |
격납고인 2행 2열에서 출발하면 2행 1열과 3행 3열로 갈 수 있고, 3행 3열에서 다시 4행 2열, 4행 3열, 2행 4열로 갈 수 있다. 2행 4열에서 1행 4열까지 닿는다. 그래서 세 관측 장비를 모두 거친 뒤에 격납고로 돌아올 수 있다. 이때 고도의 차이는 35 - 17 = 18이다.
고도의 범위를 18보다 좁게 잡으면 세 관측 장비 가운데 하나라도 닿지 못한다. 따라서 이 경우의 정답은 18이다.
입출력 예시
예시 1
입력
4 ...K KP.. .... .K.. 45 50 2 35 25 20 2 29 2 47 17 41 13 30 22 38
출력
18
예시 2
입력
2 P. K. 5 1 38 42
출력
33
예시 3
입력
5 KKKKK KKKKK KKKPK KKKKK KKKKK 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
출력
0
입력 조건
가장 먼저 첫째 줄에 산지의 한 변의 길이 N이 주어진다. N은 2 이상 50 이하의 자연수다.
이어서 N개의 줄에 걸쳐 산지의 표시가 주어진다. 각 줄은 공백 없이 붙은 N개의 문자로 이루어지며, 각 문자는 P와 K와 점(.) 가운데 하나다. P는 격자 전체에 정확히 하나 있고, K는 하나 이상 있다.
이어서 N개의 줄에 걸쳐 각 칸의 고도가 주어진다. 각 줄에는 N개의 수가 공백으로 구분되어 주어지며, 각 고도는 1 이상 1,000,000 이하의 자연수다.
입력 전체의 크기는 최대 약 20KB다.
출력 조건
드론이 격납고에서 출발해 모든 관측 장비를 거쳐 격납고로 돌아올 수 있는 경로 가운데, 지나는 칸의 최고 고도와 최저 고도의 차이가 가장 작은 값을 첫째 줄에 출력한다.
요구사항
- 드론은 맞닿은 여덟 칸으로 옮겨 갈 수 있습니다. 가로와 세로뿐 아니라 대각선도 포함합니다
- 격납고 칸의 고도도 지나는 칸에 들어갑니다
- 같은 칸을 여러 번 지나도 됩니다
- 격자에 벽이 없으므로, 모든 관측 장비를 거쳐 격납고로 돌아오는 경로는 항상 존재합니다
- 지나는 모든 칸의 고도가 같으면 정답은 0입니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
- 케이스는 15개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 15개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 15개를 전부 통과해야 해결입니다.
2 P. K. 5 1 38 42
33
4 ...K KP.. .... .K.. 45 50 2 35 25 20 2 29 2 47 17 41 13 30 22 38
18
5 KKKKK KKKKK KKKPK KKKKK KKKKK 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.