일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JavaScript
- 알고리즘
- 비동기
- react
- npm
- boj
- HTTP
- graph
- 카카오코드페스티벌
- 소형기관차
- GitHub
- commited
- Git
- web
- 1868
- JSP
- SOCKET
- 백준
- node.js
- 파핑파핑지뢰찾기
- 2869
- 응답코드
- 17822
- 달팽이는올라가고싶다
- 17471
- Java
- Ajax
- SWEA
- 타겟넘버
- staged
- 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부터 시작한다)를 출력하고,
최소 몇 번의 클릭을 해야 지뢰가 없는 모든 칸에 숫자가 표시될 것인지 출력한다.
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
글쓴이는 처음에 지뢰찾기 규칙을 몰라서 알아보는데 좀 걸렸다... 왜 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 |