devlog

[SWEA] 1868 파핑파핑 지뢰찾기-java 본문

Algorithm/SWEA

[SWEA] 1868 파핑파핑 지뢰찾기-java

bellaah 2019. 11. 2. 17:54

문제

‘파핑 파핑 지뢰 찾기’라는 유명한 게임이 있다. 이 게임은 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부터 시작한다)를 출력하고,
최소 몇 번의 클릭을 해야 지뢰가 없는 모든 칸에 숫자가 표시될 것인지 출력한다.

문제: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LwsHaD1MDFAXc&categoryId=AV5LwsHaD1MDFAXc&categoryType=CODE&&&

 

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
Comments