https://www.acmicpc.net/problem/11559
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 |
댓글