본문 바로가기
알고리즘/백준

[JAVA]백준_11559_뿌요뿌요

by 박 현 황 2021. 2. 15.

문제링크

https://www.acmicpc.net/problem/11559

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Main_11559 {
	//뿌요뿌요
	static char map[][] = new char[12][6];
	static int visited[][] = new int[12][6];
	static Queue<int[]> q = new LinkedList<>();
	static Queue<int []> q2 = new LinkedList<>();
	static int totalNum=0;
	static int dx[] = {0,0,-1,1}; //상하
	static int dy[] = {-1,1,0,0}; //좌우
	static boolean isTrue = true;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		for(int i=0;i<12;i++) {
			 String str = br.readLine();
			for(int j=0;j<6;j++) 
				map[i][j] = str.charAt(j);
		} //미로 입력
		

		while(isTrue) {
			puyopuyo();
			if(isTrue == true)
				getMap();
		}
		
		System.out.println(totalNum);
	}

	static void puyopuyo() {
		//미로 한번 싹 돌면서 뿌요뿌요 검사하기
		isTrue = false;
		//System.out.println("뿌요뿌요 함수");

		for(int i=0;i<12;i++) {
			for(int j=0;j<6;j++) {
				if(map[i][j] !='.') {
					//빈칸 아닌 무슨 색깔 만나면
					//사방위 탐색하면서 4개 이상인지 확인하기
					//System.out.println(map[i][j]);
					q.offer(new int[] {i,j});
					q2.offer(new int[] {i,j});
					visited[i][j] = 1;
					
					while(!q.isEmpty()) {
						int dir[] = q.poll();
						for(int d=0;d<4;d++) {
							int nx = dir[0]+dx[d];
							int ny = dir[1]+dy[d];
							
							if(nx<0 || nx>=map.length || ny<0 || ny>=map[0].length) continue;
							
							if(visited[nx][ny] ==0 && map[nx][ny] == map[i][j]) {
								//방문안하고 사방탐색한게 찾는 색이랑 같으면
								q.offer(new int[] {nx,ny});
								q2.offer(new int[] {nx,ny});
								visited[nx][ny] = 1; //큐에 넣어주고 방문 체크 해주기
							}
						}
					}
					
					//큐가 다 돌고 나면 
					if(q2.size()>=4) {
						//뿌요뿌요로 없앨 수 있는 사이즈면
						//System.out.println("뿌요뿌요 시작");
						isTrue = true;
						while(!q2.isEmpty()) {
							//현재 map에 뿌요뿌요 없애주기
							int dir[] = q2.poll();
							map[dir[0]][dir[1]] ='.';
						}
					}
					
					q.clear();
					q2.clear();
					//큐 두 개 비워 주고 다시 처음부터 돌면서 비울 수 있는거 찾기
				}
			}
		}
		//모든 뿌요뿌요가 끝나면 +1해주기
		if(isTrue)//연쇄가 일어났으면 totalNum +1해주기
			totalNum++;
		
		//뿌요뿌요 visited정리
		for(int i=0;i<12;i++) {
			for(int j=0;j<6;j++)
				visited[i][j] = 0;
		}
	}
	
	static void getMap() {
		//뿌요뿌요로 지워진 배열 정리
		for(int i=10;i>=0;i--) {
			for(int j=0;j<6;j++) {
				if(map[i][j] !='.' && map[i+1][j]=='.') {
					int idx = i;
					while((idx+1)<=11 && map[idx+1][j] == '.') {
						//밑에가 빈칸일때까지 계속 돌면서
						if((idx+1)>11)
							break;
						idx = idx+1;
					}
					
					map[idx][j] = map[i][j];
					map[i][j] = '.';
					
				}
			}
		}
		
/*		System.out.println("뿌요뿌요 후  배열");
		for(int i=0;i<12;i++)
			System.out.println(Arrays.toString(map[i]));*/
	}
}

 


 

뿌요를 놓고 난 후, 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색 뿌요들이 한꺼번에 없어진다.

 

위에 적혀져 있는 말 제대로 안읽고 풀어ㅆ다가 틀렸다고 떠서 다시 풀었다.

앞의 게시글의 숨바꼭질과 비슷하게 bfs로 풀었다.

상하좌우로 움직이면서 뿌요뿌요 할 대상을 찾은 후 큐에 삽입하고

큐 size>=4 이면 뿌요뿌요 할 수 있으니까 큐에서 빼면서 .으로 없애주고 이것을 전체 필드를 돌면서 확인했다.

 

뿌요뿌요 후에는 이제 비었는 공간 다 밑으로 내려줘야하니까 내려주고,,, 이렇게 풀어땅

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA]백준_11723_집합  (0) 2021.02.15
[JAVA]백준_3040_백설공주와 일곱난쟁이  (0) 2021.02.15
[JAVA]백준_1697_숨바꼭질  (0) 2021.02.14
[JAVA]백준_2563_색종이  (0) 2021.02.13
[JAVA]백준_16935_배열돌리기3  (0) 2021.02.13