본문 바로가기
Algorithm/백준

Puyo Puyo

by eclipse7727 2022. 6. 22.
 

11559번: Puyo Puyo

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

www.acmicpc.net

 

bfs에 조건이 조금 들어간 문제이다.

`같은 색상으로 연결된 구슬 4개이상 동시에 터지는게 한 사이클`

이라는것을 생각하고 풀면 어렵지 않게 풀 수 있다.

 

 

const fs = require("fs");
const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `......
    ......
    ......
    ......
    ......
    ......
    ......
    ......
    ......
    ......
    RRYY..
    RRYY..`
).split("\n");

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

const [N, M] = [12, 6];
let arr = [];
for (let i = 0; i < N; i++) {
  arr.push(input().trim().split(""));
}

const visited = new Array(N).fill(null).map((_) => new Array(M).fill(false));
const isValid = (x, y) => 0 <= x && x < N && 0 <= y && y < M;

// 방문 초기화
const visitedClear = (arr) => {
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      visited[i][j] = false;
    }
  }
};

// 세로 정렬
const verticalSort = () => {
  for (let i = 0; i < M; i++) {
    const temp = [];
    for (let j = 0; j < N; j++) {
      if (arr[j][i] !== ".") {
        temp.push(arr[j][i]);
        arr[j][i] = ".";
      }
    }
    for (let j = N - temp.length, count = 0; j < N; j++, count++) {
      arr[j][i] = temp[count];
    }
  }
};

// 방향(상하좌우)
const arrows = [
  [0, 1],
  [0, -1],
  [1, 0],
  [-1, 0],
];

let result = 0;

// bfs
const bfs = (a, b) => {
  const char = arr[a][b];
  const q = [[a, b]];
  let nowIndex = 0;
  visited[a][b] = true;
  while (q.length > nowIndex) {
    const [x, y] = q[nowIndex];
    for (let [xx, yy] of arrows) {
      const [xxx, yyy] = [x + xx, y + yy];
      if (
        isValid(xxx, yyy) &&
        arr[xxx][yyy] === char &&
        visited[xxx][yyy] === false
      ) {
        q.push([xxx, yyy]);
        visited[xxx][yyy] = true;
      }
    }
    nowIndex++;
    if (q.length <= nowIndex && q.length >= 4) {
      for (let [x, y] of q) {
        arr[x][y] = ".";
      }
      return true;
    }
  }
  return false;
};

// 사이클
while (true) {
  let isChange = false;
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      if (arr[i][j] !== "." && visited[i][j] === false) {
        const res = bfs(i, j);
        isChange = isChange || res;
      }
    }
  }
  visitedClear();
  verticalSort();
  if (isChange === true) {
    result++;
  } else {
    break;
  }
}
console.log(result);
반응형

'Algorithm > 백준' 카테고리의 다른 글

백준 1253번 좋다 python  (0) 2022.07.01
백준 도서관 1461 python  (0) 2022.06.30
백준 최소비용 구하기 성공 1916 javascript  (0) 2022.06.30
콘센트 23843 python  (0) 2022.06.29
특정한 최단 경로 1504 javascript  (0) 2022.06.29

댓글