본문 바로가기
acmicpc/Java

[JAVA] 백준 11559 뿌요뿌요 Puyo Puyo

by 952_hi 2022. 4. 6.

 

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

 

11559번: Puyo Puyo

총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.

www.acmicpc.net


1. 접근방법

1. bfs를 통해서 블럭이 4개가 인접해있는지 판단하고 맞으면 부쉬고 내려줘야겠다

2. 내리는 함수 down, 확인함수 및 파괴 check를 구현하면 되겠다. 

 

 

2. 어려웠던 부분(실수)

1. 색을 총 5개 입력받아야 하는데 4개만 받아서 로직은 맞지만 틀려서 뭐때문인지 찾는게 힘들었다. 맞왜틀

2. 연쇄 폭발 횟수와 총 폭발 횟수를 혼돈했다.

ex)입력받은 블럭 12개가 4번의 폭발을 통해 한번에 다터진다면 연쇄 폭발횟수는 1이다. 총 폭발 횟수는 4다

 

import java.io.*;
import java.util.*;
public class Main {
	static int row=12,col=6,map[][]=new int[12][6],res=0;
	static int[][] dxdy = {{0,0,1,-1},{1,-1,0,0}};
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String temp;
		for(int i=0;i<12;i++) {
			temp = br.readLine();
			for(int j=0;j<6;j++) {
				if(temp.charAt(j)=='R') {
					map[i][j] = 1;
				}else if(temp.charAt(j)=='G') {
					map[i][j] = 2;
				}else if(temp.charAt(j)=='B') {
					map[i][j] = 3;
				}else if(temp.charAt(j)=='Y') {
					map[i][j] = 4;
				}else if(temp.charAt(j)=='P') {
					map[i][j]=5;
				}
			}
		}
		//check -> 4개 이상이 있는지 있으면 폭발
		//폭발 후 내리고 또 체크
		//체크할때 한번도 일어나지않았다는 말은 전체 보드에서 4개짜리가 없다는말
		//브레이크 후 종료
		for(int i=0;i<row;i++) System.out.println(Arrays.toString(map[i]));
		System.out.println();
		while(true) {
			int value=0;
			for (int i = 0; i < row; i++) {
				for (int j = 0; j < col; j++) {
					if(map[i][j]!=0) {
						if(check(i,j,0)) {
							check(i,j,1);
							value++;
						}
					}
				}
			}		
            //폭발횟수가 아니라 연쇄 몇번이냐기 때문에
            //몇번을 세기위해서 총일어난 폭발횟수 -1 을 해줘
            //1회씩만 더해지도록 함
            // 위처리를 하기위해서 한바퀴 전체 탐색을 한 후
            // 모든 블럭을 내려줌
			down();
			if(value>=2) res-= value-1;
			if(value==0) {
				break;
			}
			for(int i=0;i<row;i++) System.out.println(Arrays.toString(map[i]));
			System.out.println();
		}
		System.out.println(res);
	}
	private static void down() {
		for (int i = row-1; i >= 0; i--) {
			for (int j = 0; j < col; j++) {
				if(map[i][j]==0) {
					int dx=i-1;
					while(dx>=0) {
						if(map[dx][j]!=0) {
							map[i][j] = map[dx][j];
							map[dx][j]=0;
							break;
						}
						dx--;
					}
				}
			}
		}
	}
	private static boolean check(int x,int y, int mod) {
		boolean visited[][] = new boolean[12][6];
		int check = 1;
		int val =map[x][y];
		if(mod == 1) {
			map[x][y] = 0;
		}
		Queue<Data> q = new LinkedList<>();
		visited[x][y] =true;
		q.offer(new Data(x, y));
		Data comp;
		int nx,ny;
		while(!q.isEmpty()) {
			comp = q.poll();
			for(int i=0;i<4;i++) {
				nx = comp.x+dxdy[0][i];
				ny = comp.y+dxdy[1][i];
				if(0<=nx && nx<row && 0<=ny && ny<col && !visited[nx][ny] && map[nx][ny]==val) {
					if(mod == 0) {
						visited[nx][ny] = true;
						q.offer(new Data(nx, ny));
					}else if(mod == 1){
						visited[nx][ny] = true;
						map[nx][ny] = 0;
						q.offer(new Data(nx, ny));
					}
					check++;
					
				}
			}
		}
		if(check>=4) {
			if(mod==1) res++;
			return true;
		}else return false;
	}
	static class Data{
		int x;
		int y;
		public Data(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
	}
}

3. 느낀점

문제를 구현하는것이 중요한게 아니라 보다 문제의 설명이나 주어진 조건을 꼼꼼히 읽어야 겠다고 많이 느꼈다.

'acmicpc > Java' 카테고리의 다른 글

[Java] 백준 9012 괄호 클래스 2++ 도전기  (0) 2022.04.09
[Java] 백준 19236 청소년 상어  (0) 2022.04.07
[JAVA] 백준 12100번 2048 (Easy)  (0) 2022.03.31
[JAVA] 백준 1929 소수 구하기  (0) 2022.03.28
[JAVA] 17404 RGB거리 2  (0) 2022.03.27

댓글