섬의 침식
문제
세로로 N칸, 가로로 M칸인 격자 모양의 해도가 있다. 각 칸에는 땅이면 1, 바다면 0이 적혀 있다. 해도의 가장자리에 해당하는 칸은 모두 바다다.
이 해도의 땅은 바닷물에 깎여 나간다. 한 해가 지날 때마다 다음과 같은 일이 한꺼번에 일어난다. 어떤 땅 칸이 가로와 세로로 맞닿은 네 칸 가운데 바깥 바다인 칸과 두 칸 이상 닿아 있으면, 그 땅 칸은 한 해 뒤에 깎여 바다가 된다. 네 칸 가운데 바깥 바다인 칸이 하나뿐이거나 아예 없으면 그 땅 칸은 그 해에는 남는다. 대각선으로 맞닿은 칸은 세지 않는다.
이때 바깥 바다는 해도의 가장자리에서 출발해 바다 칸만 밟고 걸어서 닿을 수 있는 바다를 말한다. 땅으로 둘러싸여 바깥과 끊어진 바다는 호수이며, 호수와 닿은 면은 세지 않는다.
결과적으로 처음의 해도가 주어졌을 때, 땅이 모두 깎여 없어지기까지 몇 해가 걸리는지 구하는 프로그램을 작성하여라.
예를 들어 N=5, M=5이고 해도가 다음의 표와 같다고 해보자.
| 0 | 0 | 0 | 0 | 0 |
|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 |
위쪽 땅 칸은 위, 왼쪽, 오른쪽의 세 면이 바깥 바다와 닿아 있고, 아래쪽 땅 칸은 아래, 왼쪽, 오른쪽의 세 면이 바깥 바다와 닿아 있다. 둘 다 두 면 이상이므로 한 해 뒤에 함께 깎여 사라진다. 따라서 이 경우 정답은 1이다.
호수가 있는 경우도 살펴보자. N=7, M=7이고 땅이 가운데를 둘러싸는 고리 모양으로 놓여 있다고 해보자.
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 | 1 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
고리 가운데의 아홉 칸은 바다이지만 땅에 막혀 바깥과 끊어져 있으므로 호수다. 고리의 네 귀퉁이는 바깥 바다와 두 면이 닿아 있어 첫 해에 깎인다. 반면에 귀퉁이가 아닌 칸들은 바깥 바다와 한 면만 닿고 나머지 한 면은 호수와 닿으므로 첫 해에는 남는다. 두 번째 해에는 귀퉁이가 사라진 자리가 바깥 바다가 되어 그 옆 칸들이 두 면씩 닿게 되므로 함께 깎인다. 세 번째 해에는 남은 네 칸이 모두 깎인다. 따라서 이 경우 정답은 3이다.
입출력 예시
예시 1
입력
5 5 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
출력
1
예시 2
입력
3 3 0 0 0 0 0 0 0 0 0
출력
0
예시 3
입력
8 9 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
출력
4
입력 조건
가장 먼저 해도의 세로 칸 수 N과 가로 칸 수 M이 공백으로 구분되어 한 줄에 주어진다. N과 M은 각각 100보다 작거나 같은 자연수다.
이어서 N개의 줄에 걸쳐 해도의 각 줄 정보가 위에서 아래로 차례대로 주어진다. 한 줄에는 M개의 값이 공백으로 구분되어 주어지며, 각 값은 땅이면 1, 바다면 0이다. 해도의 첫 줄과 마지막 줄, 그리고 각 줄의 첫 칸과 마지막 칸은 모두 0이다.
출력 조건
땅이 모두 깎여 없어지기까지 걸리는 해의 수를 한 줄에 출력한다. 처음부터 땅이 하나도 없다면 0을 출력한다. 수 하나만 출력하므로 줄 끝에 남기는 공백은 없다.
요구사항
- 한 해의 침식은 모든 땅 칸에 한꺼번에 일어납니다. 같은 해에 깎인 칸이 같은 해의 다른 칸을 더 깎지는 않습니다
- 바깥 바다와 두 면 이상 닿은 땅 칸만 깎입니다
- 땅으로 둘러싸여 바깥과 끊어진 호수는 바깥 바다가 아니므로, 호수와 닿은 면은 세지 않습니다
- 맞닿은 칸은 가로와 세로의 네 방향만 봅니다. 대각선은 보지 않습니다
- 해도의 가장자리는 늘 바다이므로 바깥 바다는 가장자리에서 퍼져 나갑니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
- 케이스는 15개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 15개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 15개를 전부 통과해야 해결입니다.
3 3 0 0 0 0 0 0 0 0 0
0
5 5 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
1
8 9 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
4
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.