Puyo Puyo
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 11855 | 4383 | 3103 | 35.503% |
문제
뿌요뿌요의 룰은 다음과 같다.
필드에 여러 가지 색깔의 뿌요를 놓는다. 뿌요는 중력의 영향을 받아 아래에 바닥이나 다른 뿌요가 나올 때까지 아래로 떨어진다.
뿌요를 놓고 난 후, 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색 뿌요들이 한꺼번에 없어진다.
뿌요들이 없어지고 나서 위에 다른 뿌요들이 있다면, 역시 중력의 영향을 받아 차례대로 아래로 떨어지게 된다.
아래로 떨어지고 나서 다시 같은 색의 뿌요들이 4개 이상 모이게 되면 또 터지게 되는데, 터진 후 뿌요들이 내려오고 다시 터짐을 반복할 때마다 1연쇄씩 늘어난다.
터질 수 있는 뿌요가 여러 그룹이 있다면 동시에 터져야 하고 여러 그룹이 터지더라도 한번의 연쇄가 추가된다.
남규는 최근 뿌요뿌요 게임에 푹 빠졌다. 이 게임은 1:1로 붙는 대전게임이라 잘 쌓는 것도 중요하지만, 상대방이 터뜨린다면 연쇄가 몇 번이 될지 바로 파악할 수 있는 능력도 필요하다. 하지만 아직 실력이 부족하여 남규는 자기 필드에만 신경 쓰기 바쁘다. 상대방의 필드가 주어졌을 때, 연쇄가 몇 번 연속으로 일어날지 계산하여 남규를 도와주자!
입력
총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다.
이때 .
은 빈공간이고 .
이 아닌것은 각각의 색깔의 뿌요를 나타낸다.
R
은 빨강, G
는 초록, B
는 파랑, P
는 보라, Y
는 노랑이다.
입력으로 주어지는 필드는 뿌요들이 전부 아래로 떨어진 뒤의 상태이다. 즉, 뿌요 아래에 빈 칸이 있는 경우는 없e다.
출력
현재 주어진 상황에서 몇연쇄가 되는지 출력한다. 하나도 터지지 않는다면 0을 출력한다.
예제 입력 1
xxxxxxxxxx
......
......
......
......
......
......
......
......
.Y....
.YG...
RRYG..
RRYGG.
예제 출력 1
xxxxxxxxxx
3
풀이
문제에서 시키는데로 구현만 해주면 되는 것이라 따로 풀이 할 게 없습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static boolean game_end;
static int dx[] = {0,0,1,-1};
static int dy[] = {-1,1,0,0};
static int n,m;
static String map[][];
static int ans =0;
static boolean flag = false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = 12;
m = 6;
map = new String[n][m];
// map input
for(int i=0; i<n; i++) {
String[] t = br.readLine().split("");
for(int j=0; j<m; j++) {
map[i][j] = t[j];
}
}
while(true) {
game_end = true; // 4개 이상의 뿌요를 못터트리면 게임을 종료시키는 flag
// 4개 이상의 뿌요를 터트릴수 있는지 체크
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(!map[i][j].equals(".")) {
bfs(i,j);
}
}
}
map_down();
if(game_end) {
break;
}
ans++;
}
System.out.println(ans);
}
public static void map_down() {
for(int i=n-1; i>=0; i--) {
for(int j=0; j<m; j++) {
if(map[i][j].equals(".")) {
int remove = i;
int fill = i-1;
while(fill>=0) {
if(!map[fill][j].equals(".")) {
map[remove][j] = map[fill][j];
map[fill][j] = ".";
break;
}
fill-=1;
}
}
}
}
}
public static void bfs(int x, int y) {
ArrayList<Node>list = new ArrayList<>(); // 지울 좌표 담을 리스트
Queue<Node> q = new LinkedList<>();
int cnt = 1;
String color = map[x][y];
boolean visited[][] = new boolean[n][m];
visited[x][y] =true;
q.add(new Node(x,y));
while(!q.isEmpty()) {
Node a = q.poll();
for(int i=0; i<4; i++) {
int nx = a.x+dx[i];
int ny = a.y+dy[i];
if(isRange(nx,ny) && map[nx][ny].equals(color) && !visited[nx][ny]) {
visited[nx][ny] = true;
q.add(new Node(nx,ny));
list.add(new Node(nx,ny));
cnt++;
}
}
}
if(cnt>=4) {
game_end = false;
map[x][y]=".";
for(Node a : list) {
map[a.x][a.y]=".";
}
}
}
public static boolean isRange(int x, int y) {
if(x>=0 && y>=0 && x<n && y<m) {
return true;
}
return false;
}
}
class Node{
int x,y;
Node(int x, int y){
this.x=x;
this.y=y;
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT - 실패율 (0) | 2021.01.07 |
---|---|
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT - 오픈 채팅방 (0) | 2021.01.06 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - 프렌즈4블록 (0) | 2021.01.06 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - 뉴스 클러스터링 (0) | 2021.01.06 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - 셔틀버스 (0) | 2021.01.06 |