일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- node.js
- 카카오코드페스티벌
- HTTP
- 백준
- Git
- 타겟넘버
- boj
- commited
- staged
- 1868
- 2869
- npm
- SWEA
- Ajax
- 응답코드
- 비동기
- 달팽이는올라가고싶다
- Java
- 17471
- 소형기관차
- web
- JavaScript
- JSP
- SOCKET
- graph
- 파핑파핑지뢰찾기
- 17822
- GitHub
- 알고리즘
- react
- Today
- Total
devlog
[SWEA] 1868 파핑파핑 지뢰찾기-java 본문
문제
‘파핑 파핑 지뢰 찾기’라는 유명한 게임이 있다. 이 게임은 RXC 크기의 표를 이용하는 게임인데, 표의 각 칸에는 지뢰가 있을 수도 있고 없을 수도 있다.
표의 각 칸을 클릭했을 때, 그 칸이 지뢰가 있는 칸이라면 ‘파핑 파핑!’이라는 소리와 함께 게임은 끝난다.
지뢰가 없는 칸이라면 변이 맞닿아 있거나 꼭지점이 맞닿아 있는 최대 8칸에 대해 몇 개의 지뢰가 있는지가 0에서 8사이의 숫자로 클릭한 칸에 표시된다.
만약 이 숫자가 0이라면 근처의 8방향에 지뢰가 없다는 것이 확정된 것이기 때문에 그 8방향의 칸도 자동으로 숫자를 표시해 준다.
실제 게임에서는 어떤 위치에 지뢰가 있는지 알 수 없지만, 이 문제에서는 특별히 알 수 있다고 하자.
지뢰를 ‘*’로, 지뢰가 없는 칸을 ‘.’로, 클릭한 지뢰가 없는 칸을 ‘c’로 나타냈을 때 표가 어떻게 변화되는지 나타낸다.
세 번째 예에서는 0으로 표시 될 칸들과 이와 인접한 칸들이 한 번의 클릭에 연쇄적으로 숫자가 표시된 것을 볼 수 있다.
파핑 파핑 지뢰 찾기를 할 때 표의 크기와 표가 주어질 때, 지뢰가 있는 칸을 제외한 다른 모든 칸의 숫자들이 표시되려면 최소 몇 번의 클릭을 해야 하는지 구하는 프로그램을 작성하라.
입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에 하나의 정수 N(1 ≤ N ≤ 300) 이 주어진다. 이는 지뢰 찾기를 하는 표의 크기가 N*N임을 나타낸다.
다음 N개의 줄의 i번째 줄에는 길이가 N인 문자열이 주어진다.
이 중 j번째 문자는 표에서 i번째 행 j번째 열에 있는 칸이 지뢰가 있는 칸인지 아닌지를 나타낸다.
‘*’이면 지뢰가 있다는 뜻이고, ‘.’이면 지뢰가 없다는 뜻이다. ‘*’와 ‘.’외의 다른 문자는 입력으로 주어지지 않는다.
출력
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,
최소 몇 번의 클릭을 해야 지뢰가 없는 모든 칸에 숫자가 표시될 것인지 출력한다.
풀이
글쓴이는 처음에 지뢰찾기 규칙을 몰라서 알아보는데 좀 걸렸다... 왜 0이 연속적으로 공개되는지 몰랐다.
알아봤더니 0을 클릭하면 주변에 있는 8칸은 다 공개되는 것이었다. (게임 안 하는 거 티 내기)
그리고 그 옆이 0이면 그 0 또한 위와 같은 작업을 반복하기 때문에 재귀를 썼다.
그래서 최소한의 클릭으로 지뢰가 없는 칸을 모두 오픈하려면 0인 곳부터 클릭해서 오픈한다.(재귀적으로 주변 8칸 중 0이 있으면 그 주변도 오픈함) 0인 칸을 모두 오픈했으면 나머지 지뢰가 아니고 오픈하지 않은 칸은 클릭했을 때 해당 칸만 열리기 때문에 남은 칸(공개되지 않은 칸) 중 지뢰가 아닌 칸의 숫자를 더한 것이 최소한의 클릭이 된다.
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA] 2806 N-Queen-java (405) | 2019.11.03 |
---|---|
[SWEA] 1240 단순 2진 암호코드-java (0) | 2019.07.02 |