백준 Puyo Puyo

KIMYEONGJUN·4일 전
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다.
이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다.
R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.
입력으로 주어지는 필드는 뿌요들이 전부 아래로 떨어진 뒤의 상태이다.
즉, 뿌요 아래에 빈 칸이 있는 경우는 없다.

현재 주어진 상황에서 몇연쇄가 되는지 출력한다.
하나도 터지지 않는다면 0을 출력한다.

내가 이 문제를 보고 생각해본 부분

12 x 6 크기의 2차원 배열 field에 필드 상태를 저장한다.
visited 배열은 BFS할 때 중복 방문 체크용이다.
bfs(int x, int y) 메서드는 현재 위치에서 같은 색 뿌요끼리 연결된 모든 좌표를 리스트로 반환한다.
applyGravity() 메서드는 각 열별로 뿌요를 아래쪽으로 몰아주는 작업을 한다.
메인 루프에서는 아래를 반복한다:
모든 칸을 탐색하며 4개 이상 연결된 뿌요 그룹이 있으면 좌표를 모은다.
그룹이 없다면 반복 종료.
그룹 좌표의 뿌요를 '.'으로 바꾼다(터뜨림).
중력을 적용해 뿌요를 다시 아래로 내린다.
연쇄 횟수 증가.
최종적으로 chainCount를 출력한다.

코드로 구현

package baekjoon.baekjoon_33;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

// 백준 11559번 문제
public class Main1340 {
    static char[][] field = new char[12][6];
    static boolean[][] visited;
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; i < 12; i++) {
            field[i] = br.readLine().toCharArray();
        }

        int chainCount = 0;

        while (true) {
            visited = new boolean[12][6];
            List<int[]> toPop = new ArrayList<>();
            for (int i = 0; i < 12; i++) {
                for (int j = 0; j < 6; j++) {
                    if (field[i][j] != '.' && !visited[i][j]) {
                        List<int[]> connected = bfs(i, j);
                        if (connected.size() >= 4) {
                            toPop.addAll(connected);
                        }
                    }
                }
            }

            // 더 이상 터질 그룹이 없으면 종료
            if (toPop.isEmpty())
                break;

            // 뿌요 터뜨리기
            for (int[] pos : toPop) {
                field[pos[0]][pos[1]] = '.';
            }

            // 중력 적용
            applyGravity();
            chainCount++;
        }

        System.out.println(chainCount);
        br.close();
    }

    static List<int[]> bfs(int x, int y) {
        List<int[]> group = new ArrayList<>();
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x, y});
        visited[x][y] = true;
        char color = field[x][y];
        group.add(new int[]{x, y});

        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            int cx = cur[0];
            int cy = cur[1];

            for (int d = 0; d < 4; d++) {
                int nx = cx + dx[d];
                int ny = cy + dy[d];
                if (nx >= 0 && nx < 12 && ny >= 0 && ny < 6) {
                    if (!visited[nx][ny] && field[nx][ny] == color) {
                        visited[nx][ny] = true;
                        queue.add(new int[]{nx, ny});
                        group.add(new int[]{nx, ny});
                    }
                }
            }
        }

        return group;
    }

    static void applyGravity() {
        for (int col = 0; col < 6; col++) {
            int emptyRow = 11; // 뿌요가 채워질 위치 시작 (아래에서부터)
            for (int row = 11; row >= 0; row--) {
                if (field[row][col] != '.') {
                    char temp = field[row][col];
                    field[row][col] = '.';
                    field[emptyRow][col] = temp;
                    emptyRow--;
                }
            }
        }
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글