기록하는 개발자

[백준 1996번] 지뢰찾기 - JAVA 알고리즘 본문

Baekjoon Online Judge

[백준 1996번] 지뢰찾기 - JAVA 알고리즘

gitseok 2022. 6. 17. 11:30

1996번
문제
다들 windows에서 지원하는 지뢰 찾기 게임을 한번쯤은 해 보았을 것이다. 특히 동호는 지뢰찾기의 매니아로 알려져 있다. 지뢰 찾기 map은 N*N의 정사각형 모양으로 각 칸에는 숫자가 들어가 있거나 지뢰가 들어가 있다. 빈 칸에는 숫자 0이 들어있다고 생각하자.
map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸 중에서 지뢰가 들어 있는 칸이 몇 개인지를 나타내 준다. 물론 인접한 칸이 map 내부에 있는 경우에 대해서만 생각하면 된다. 예제를 보면 더 잘 이해할 수 있을 것이다.
이번 문제는 조금 업그레이드 된 지뢰 찾기로, 한 칸에 한 개의 지뢰가 있는 것이 아니고, 한 칸에 여러 개(1 이상 9 이하)의 지뢰가 묻혀 있는 게임이다. 따라서 map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸들에 들어 있는 지뢰의 총 개수가 된다.
이미 windows 지뢰찾기 같은 것을 마스터한 영식이는, map에서 지뢰에 대한 정보만이 주어졌을 때, 영식이는 map을 완성하고 싶다고 한다. N과 지뢰의 위치가 주어졌을 때, 영식이를 도와서 지뢰 찾기 map을 완성하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 줄에는 지뢰 찾기 map에 대한 정보가 주어지는데 '.' 또는 숫자로 이루어진 문자열이 들어온다. '.'는 지뢰가 없는 것이고 숫자는 지뢰가 있는 경우로 그 칸의 지뢰의 개수이다. 한 줄은 N개의 문자로 이루어져 있다.
출력
N개의 줄에 걸쳐서 완성된 지뢰 찾기 map을 출력한다. 지뢰는 '*'로 출력하며. 10 이상인 경우는 'M'(Many)으로 출력하면 된다. map은 숫자 또는 'M' 또는 '*'로만 이루어져 있어야 한다.
예제 입력 예제 출력
   
5
1....
..3..
.....
.4...
...9.
*4330
14*30
47730
4*M99
44M*9

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.ParseException;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException, ParseException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언

		int N = Integer.parseInt(br.readLine()); //가로세로 길이
		int[][] intArr = new int[N][N]; //입력한 배열
		int[][] mapArr = new int[N][N]; //누적 배열
		char num; //입력된 값 분할
		String str;
		for(int i = 0; i<N; i++) {		//한줄 단위
					str = br.readLine();
			
			for(int j = 0; j<N; j++) {	//한칸 단위
				num = (str.charAt(j));
				
				if(num=='.') {			//. 이면 0으로 세팅
					intArr[i][j] = 0;
				}else {
				intArr[i][j] = Character.getNumericValue(num); //int로 변환
				}
				
				//숫자 주위에 해당 숫자만큼 더해줌
				//배열 범위를 넘어가지 않게 조건부여
				if(i-1>=0) {
					mapArr[i-1][j] 		= mapArr[i-1][j] 	+ intArr[i][j];
					
					if(j-1>=0) {
					mapArr[i-1][j-1] 	= mapArr[i-1][j-1] 	+ intArr[i][j];
					}
					if(j+1<N) {
					mapArr[i-1][j+1] 	= mapArr[i-1][j+1]	+ intArr[i][j];	
					}
				}
				
				if(j+1<N) {
					mapArr[i][j+1] 		= mapArr[i][j+1] 	+ intArr[i][j];	
				}
				if(j-1>=0) {
					mapArr[i][j-1] 		= mapArr[i][j-1] 	+ intArr[i][j];	
				}
				
				if(i+1<N) {
					mapArr[i+1][j] 		= mapArr[i+1][j] 	+ intArr[i][j];
					if(j-1>=0) {
					mapArr[i+1][j-1] 	= mapArr[i+1][j-1] 	+ intArr[i][j];	
					}
					if(j+1<N) {
					mapArr[i+1][j+1] 	= mapArr[i+1][j+1] 	+ intArr[i][j];	
					}
				}		
			}
		}
		int mapNum; //누적값 세팅용
		int intNum; //* 표시용
		
		for(int i = 0; i<N; i++) {		//한줄씩 작성
			for(int j = 0; j<N; j++) {	//한칸씩 작성
				mapNum=mapArr[i][j];	//누적값 조회
				intNum=intArr[i][j];	//입력값 조회
				
				if(intNum>0) {			//입력값이 존재하면 "*" 로 변환
					bw.write("*");
				}else if(mapNum>=10) {	//누적값이 10 이상이면 "M"출력
					bw.write("M");
				}else {					//누적값 출력
					bw.write(mapNum+"");	
				}
			}
			bw.write("\n");				//개행
		}
		bw.close();
		br.close();
	}
}

실행 결과

개인적으로 정리한 내용을 간단하게 풀어 작성했습니다.
이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다.
Comments