[프로그래머스] [1차] 프렌즈4블록 (JS)

hhkim·2023년 9월 28일
0

Algorithm - JavaScript

목록 보기
144/188
post-thumbnail

풀이 과정

  1. 각 요소에 대해 반복하면서 인접한 3칸이 현재 칸과 같은지 확인
  2. 같으면 소문자로 변경
  3. 한 번 과정을 마지면 소문자인 칸을 null로 치환하고 결과 개수 증가
  4. 3번에서 치환할 칸이 없으면 무한 루프 빠져나오기
  5. 앞 행부터 반복하면서 뒷 행이 null이면 위로 올리기

코드

function solution(m, n, board) {
  board = board.map((s) => [...s]);
  const d = [
    [0, 1],
    [1, 1],
    [1, 0],
  ]; // 오른, 대각, 아래
  let result = 0;
  while (true) {
    for (let i = 0; i < m - 1; ++i) {
      for (let j = 0; j < n - 1; ++j) {
        const curr = board[i][j];
        if (!curr) continue;
        const arr = [[i, j]];
        for (let k = 0; k < 3; ++k) {
          const ny = i + d[k][0];
          const nx = j + d[k][1];
          if (!board[ny][nx]) break;
          if (curr.toLowerCase() !== board[ny][nx].toLowerCase()) break;
          arr.push([ny, nx]);
        }
        if (arr.length !== 4) continue;
        for (const [y, x] of arr) {
          board[y][x] = board[y][x].toLowerCase();
        }
      }
    }

    let tmp = 0;
    for (let i = 0; i < m; ++i) {
      for (let j = 0; j < n; ++j) {
        const curr = board[i][j];
        if (!curr) continue;
        if (curr === curr.toLowerCase()) {
          board[i][j] = null;
          ++tmp;
        }
      }
    }
    if (!tmp) break;
    result += tmp;

    for (let i = 0; i < m - 1; ++i) {
      for (let j = 0; j < n; ++j) {
        if (board[i][j] && board[i + 1][j] === null) {
          for (let k = i + 1; k > 0; --k) {
            [board[k][j], board[k - 1][j]] = [board[k - 1][j], board[k][j]];
          }
        }
      }
    }
  }

  return result;
}

🤔

너무 복잡하게 풀었나 싶으면서도 1시간 써서 스스로 풀었다는 사실에 만족했다.
이런 게임을 좋아해서 많이 해봤지만 간단하게 구현하는 것도 이 정도로 고민을 해야 하는데, 게임 개발자들이 정말 대단하다는 생각이 들었다.

0개의 댓글