광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 애플워치 앱 만들기
  • 합주
  • DP
  • BFS
  • BOJ
  • 다이나믹 프로그래밍
  • 운영체제
  • 드린이
  • 애플워치 앱
  • 프로그래머스
  • 파이썬
  • 오블완
  • 백준
  • 구현
  • 알고리즘
  • 티스토리챌린지
  • 개념
  • 컴퓨터 사이언스
  • 자바
  • OS

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

[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;
				}
			}
		}

	}

}

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

반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[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
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 swea 5653] 줄기세포배양
    • [Java/자바 swea 4013] 특이한 자석
    • [Java/자바 swea 5643] 키 순서
    • [Java/자바 swea 8458] 원점으로 집합
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바