알고리즘/문제 풀이

[Java/자바 swea 1868] 파핑파핑 지뢰찾기

광규니 2021. 10. 1. 15:41
반응형

풀이

우선 map에 character 형식으로 담아준 뒤, 팔방탐색을 통해 지뢰의 개수를 넣어줬습니다.

 

지뢰의 개수가 0 일때가 핵심 !!

 

map[i][j]=0 일때 주변의 0들을 탐색하며

붙어있는 0들도 같이 한번의 탐색하며 방문 처리를 합니다 .

 

0인것들을 전부 다 방문처리를 한 후

다시 반복문을 통해서 방문하지 않은 것들의 개수를 세주면

풀이 완료!

import java.io.*;
import java.util.*;
public class Solution{
	static char[][] map;
	static boolean[][] visited;
	static int[] dx = {0,1,0,-1, 1,1,-1,-1};
	static int[] dy = {1,0,-1,0, 1,-1,1,-1};
	static int n;
	static Queue<int[]> queue= new LinkedList<int[]>();
	public static void main(String[] args)throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int tc=Integer.parseInt(br.readLine());
		for(int t=1 ; t<=tc ; t++) {
			n=Integer.parseInt(br.readLine());
			map= new char[n][n];
			visited = new boolean[n][n];
			for(int i=0 ; i < n ;i++) {
				String tmp=br.readLine();
				for(int j=0 ; j< n ; j++) {
					map[i][j]=tmp.charAt(j);
					if(map[i][j]=='*') visited[i][j]=true;

				}
			}
			// map에 주변 지뢰를 탐색
			for(int i=0 ; i<n ;i++) {
				for(int j=0; j<n ;j++) {
					int cnt=0;
					for(int k=0; k<8 ; k++) {
						int nx=i+dx[k];
						int ny=j+dy[k];
						if(nx<0 || ny<0 || nx>=n || ny>=n) continue;
						if(map[nx][ny]=='*') cnt+=1; 
					}		
					
					if(map[i][j]=='.')map[i][j]=(char)(cnt+'0');
				}
			}
			int total=0;
			//0 이 뭉쳐있는것들 방문처리, 0옆에 붙어있는거 방문처리
			for(int i=0 ; i<n ; i++) {
				for(int j=0 ;j<n; j++) {
					if(map[i][j]=='0' && visited[i][j]==false) {
						bfs(i,j);
						total+=1;
					}
				}
			}
			// 나머지 방문 안된것들만 더하기
			for(int i=0 ; i<n ; i++) {
				for(int j=0 ;j<n; j++) {
					if(visited[i][j]==false) {
						total+=1;
					}
				}
			}
			System.out.println("#"+t+" "+total);
		}

	}
	private static void bfs(int i, int j) {
		// TODO Auto-generated method stub
		queue.add(new int[] {i,j});
		visited[i][j]=true;
		//bfs
		while(!queue.isEmpty()) {
			int[] cur=queue.poll();
			int x=cur[0];
			int y=cur[1];
			for(int k=0; k<8 ; k++) {
				int nx=x+dx[k];
				int ny=y+dy[k];
				if(nx<0 || ny<0 || nx>=n || ny>=n) continue;
				// 0일 경우
				if(visited[nx][ny]==false &&map[nx][ny]=='0') {
					visited[nx][ny]=true;
					queue.add(new int[] {nx,ny});
				}
				//0이 아닐경우
				else if(visited[nx][ny]==false && map[nx][ny]!='0') {
					visited[nx][ny]=true;
				}
			}
		}

	}

}

어렵지 않지만, 어렵게 생각해서 오래 걸린 문제,,,

반응형