목차
1. 문제 설명
2. 문제 풀이
3. 정답 코드
1. 문제 설명
'뿌요뿌요'는 같은 색상끼리 터트리는 게임이다.

🌱 뿌요뿌요 규칙
1) 같은 색상이 4개 이상이 있을 때 (인접한 상하좌우 4개 이상), 터뜨린다.
2) 만약 터뜨릴 수 있는 것들이 여러 집단일 때, 동시에 터뜨린다.
이과정을 몇번 반복하는 지 카운트하는 문제이다.
2. 문제 풀이
1) DFS를 순회하며, 4개 이상인지 확인하기
- dfs 함수를 사용하여 같은 색깔의 블록을 탐색한다. 탐색한 블록의 좌표를 record 배열에 저장한다.

2) 4개 이상일 경우, 다녀간 경로를 모두 터뜨리기
- 탐색이 끝난 후, record 배열의 길이가 4이상이면 해당 블록들을 터뜨린다.
- 터뜨린다는 것을 '.' 로 만드는 것이다.

3) 모두 터뜨린 다음 그리드를 재정리하기
- 터뜨린 후, 그리드를 아래에서 위로 재정리하며 빈 공간을 채운다.

사실 이 부분은 스스로 구현을 못했고, 생각도 안났던....
그래서 이해하기 쉽게 그림으로 표현해보았다.

2. 정답 코드
const fs = require("fs");
const input = fs.readFileSync("./example.txt", "utf8").trim().split("\n");
var grid = input.slice().map((line) => line.split(""));
// 뿌요 그리드의 행, 열
var ROW = 12;
var COL = 6;
var dr = [0, 1, 0, -1];
var dc = [1, 0, -1, 0];
var answer = 0;
var visited = [];
var record = [];
function dfs(r, c) {
visited[r][c] = 1;
record.push([r, c]);
for (let i = 0; i < 4; i++) {
var nr = r + dr[i];
var nc = c + dc[i];
if (
0 <= nr &&
nr < ROW &&
0 <= nc &&
nc < COL &&
grid[nr][nc] === grid[r][c] &&
!visited[nr][nc]
) {
dfs(nr, nc);
}
}
}
while (true) {
var flag = 0;
visited = Array.from({ length: ROW }, () =>
Array.from({ length: COL }).fill(0)
);
for (let i = 0; i < ROW; i++) {
for (let j = 0; j < COL; j++) {
if (grid[i][j] !== "." && !visited[i][j]) {
record = [];
dfs(i, j);
if (record.length >= 4) {
for (const [r, c] of record) {
grid[r][c] = ".";
}
flag = 1;
}
}
}
}
if (!flag) break;
for (let j = 0; j < COL; j++) {
let q = [];
for (let i = 11; i >= 0; i--) {
if (grid[i][j] !== ".") {
q.push(grid[i][j]);
}
}
for (let i = 0; i < q.length; i++) {
grid[11 - i][j] = q[i];
}
for (let i = q.length; i < ROW; i++) {
grid[11 - i][j] = ".";
}
}
answer++;
}
console.log(answer);
배운점
나는 구현에서 약하다는 것을 다시 한번 느꼈다. 시간 복잡도 신경쓰지 않고, 완전탐색으로 구현을 먼저 생각하는 습관을 들여야겠다!
'Algorithm' 카테고리의 다른 글
[JavaScript] 백준 11725 - 트리의 부모 찾기 (0) | 2025.03.05 |
---|---|
[Javascript] 프로그래머스 - 서버 증설 횟수 (0) | 2025.02.21 |
[Javascript] 백준 - 외판원 순회 2 (0) | 2025.02.17 |
[JavaScript] 프로그래머스 - 정수 삼각형 (0) | 2025.02.15 |
[Javascript] 가장 먼 노드 (0) | 2025.02.13 |