발굴 구역 지키기
문제
발굴 현장을 N행 M열의 격자로 나누어 관리한다. 각 칸은 세 가지 상태 중 하나다. 값이 0인 칸은 아직 아무것도 없는 맨땅이다. 값이 1인 칸은 단단한 암반이라 아무것도 지나가지 못한다. 값이 2인 칸은 모래 유입구이며, 이곳에서 모래가 흘러나온다.
모래는 유입구가 있는 칸에서 출발해 상하좌우로 맞닿은 맨땅으로 흘러 들어간다. 한 번 모래가 들어간 칸에서 다시 상하좌우로 번져 나가므로, 유입구와 맨땅으로만 이어진 곳이면 아무리 멀어도 모래가 닿는다. 암반이 있는 칸으로는 흘러 들어가지 못한다. 모래가 들어간 칸은 더 이상 발굴할 수 없다.
발굴을 시작하기 전에 현장 책임자는 콘크리트 블록을 설치할 수 있다. 블록은 맨땅인 칸에만 놓을 수 있으며, 블록을 놓은 칸은 암반과 같아져서 모래가 지나가지 못한다. 블록을 놓은 칸 자체도 발굴할 수 없다. 블록은 더 놓을 수도 덜 놓을 수도 없이 정확히 세 개를 놓아야 한다.
블록을 세 개 놓은 뒤에 모래가 더 갈 곳이 없을 때까지 흘렀다고 하자. 이때 모래가 들어가지 않고 남은 맨땅 칸의 수를 발굴 가능 칸의 수라고 한다. 블록을 가장 잘 놓았을 때 발굴 가능 칸의 수가 최대 몇 개가 되는지 계산하는 프로그램을 작성하여라.
예를 들어 N=3, M=4인 현장이 다음의 표와 같다고 해보자. 각 위치는 (행, 열)로 나타내며, 행과 열의 번호는 1부터 시작한다.
| 2 | 0 | 2 | 1 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
맨땅은 여덟 칸, 암반은 두 칸, 모래 유입구는 두 칸이다. 이때 (1, 2)와 (2, 1)과 (2, 3)의 세 칸에 블록을 놓는다고 해보자. 블록을 놓은 칸을 1로 바꿔 적으면 현장은 다음과 같다.
| 2 | 1 | 2 | 1 |
|---|---|---|---|
| 1 | 0 | 1 | 0 |
| 0 | 0 | 1 | 0 |
(1, 1)에 있는 유입구의 상하좌우는 블록 두 개와 격자 밖이라서 모래가 나갈 곳이 없다. (1, 3)에 있는 유입구도 상하좌우가 블록 두 개와 원래 있던 암반이라서 마찬가지다. 따라서 모래는 어느 칸으로도 흘러가지 못한다.
남은 맨땅은 (2, 2)와 (2, 4)와 (3, 1)과 (3, 2)와 (3, 4)로 다섯 칸이고, 모두 발굴할 수 있다. 블록을 다르게 놓아서 다섯 칸보다 많이 남기는 방법은 없다. 따라서 이 예시에서의 정답은 5다.
입출력 예시
예시 1
입력
3 4 2 0 2 1 0 0 0 0 0 0 1 0
출력
5
예시 2
입력
3 3 0 2 1 2 0 2 0 0 0
출력
1
예시 3
입력
4 4 1 2 0 0 0 0 0 1 0 1 0 0 1 0 0 0
출력
8
입력 조건
가장 먼저 현장의 행의 수 N과 열의 수 M이 한 줄에 공백으로 구분되어 주어진다. N과 M은 각각 3 이상 8 이하의 자연수다.
이어서 N개의 줄에 걸쳐 현장의 각 행이 주어진다. 각 줄에는 M개의 수가 공백으로 구분되어 주어지며, 각 수는 0, 1, 2 중 하나다. 0은 맨땅, 1은 암반, 2는 모래 유입구를 의미한다.
맨땅인 칸은 항상 3개 이상 주어지고, 모래 유입구는 1개 이상 3개 이하로 주어진다.
출력 조건
블록을 가장 잘 놓았을 때의 발굴 가능 칸의 수를 한 줄에 하나의 수로 출력한다. 블록을 놓은 세 칸은 발굴 가능 칸으로 세지 않으므로, 이 값은 처음에 주어진 맨땅 칸의 수에서 3을 뺀 값보다 클 수 없다.
요구사항
- 블록은 맨땅인 칸에만 놓으며, 정확히 세 개를 놓습니다
- 모래는 유입구에서 출발해 상하좌우로 맞닿은 맨땅을 따라 갈 곳이 없을 때까지 번집니다
- 암반과 블록은 모래를 막으며, 두 칸 모두 발굴 가능 칸으로 세지 않습니다
- 발굴 가능 칸의 수가 최대가 되는 경우의 값 하나만 출력합니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
- 케이스는 15개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 15개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 15개를 전부 통과해야 해결입니다.
3 3 0 2 1 2 0 2 0 0 0
1
3 4 2 0 2 1 0 0 0 0 0 0 1 0
5
4 4 1 2 0 0 0 0 0 1 0 1 0 0 1 0 0 0
8
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.