반응형
풀이
우선 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;
}
}
}
}
}
어렵지 않지만, 어렵게 생각해서 오래 걸린 문제,,,
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 swea 5653] 줄기세포배양 (0) | 2021.10.11 |
---|---|
[Java/자바 swea 4013] 특이한 자석 (0) | 2021.10.01 |
[Java/자바 swea 5643] 키 순서 (0) | 2021.09.30 |
[Java/자바 swea 8458] 원점으로 집합 (0) | 2021.09.29 |
[Java/자바 백준 4485] 녹색 옷 입은 애가 젤다지? (0) | 2021.09.29 |