PS/제코베 JS 100제

제코베 JS 100제 / 100 / 퍼즐게임

KimMinJun 2022. 10. 14. 21:12

N x M으로 이루어진 아래와 같은 공간에 퍼즐이 쌓여져 있습니다.

 

퍼즐을 맞추기 위해서는 반드시 맨 오른쪽 줄로 이동시켜 줘야 합니다.

만약 종류가 같은 퍼즐이 연속될 시에 점수가 추가되며 그 퍼즐은 사라집니다.

 

점수는 다음과 같습니다.

- 파란색 공 : 1점

- 빨간색 공 : 2점

- 노란색 공 : 3점

- 초록색 공 : 4점

- 주황색 공 : 5점

점수는 공의 개수만큼 추가됩니다.

예를 들어 빨간색 공이 2개 연속되어 없어졌을 경우 2*2 = 4점입니다.

 

게임 플레이어는 게임이 시작되면 어떤 퍼즐을 이동할 것인지 모두 작성합니다.

만약 비어있는 곳을 선택하게 된다면 점수가 1점 감소하며 그대로 진행합니다.

위 규칙에 맞는 점수를 리턴하는 함수를 작성하세요.

 

 

/**
 * 퍼즐의 점수를 나타낸 2차원 배열을 인자로 받아,
 * 오른쪽으로 90도를 돌린 배열을 반환하는 함수
 *
 * @param {number[][]} board 퍼즐의 점수를 나타낸 2차원 배열
 * @returns {number[][]} 오른쪽으로 90도 돌린 배열
 */
function getRotateBoard(board) {
  let rotateBoard = [];

  let tmp = [];
  for (let col = 0; col < board[0].length; col += 1) {
    tmp = [];
    for (let row = 0; row < board.length; row += 1) {
      tmp.push(board[row][col]);
    }
    tmp = tmp.filter((el) => el !== 0).reverse();
    rotateBoard.push(tmp);
  }

  return rotateBoard;
}

/**
 * 오른쪽으로 90도 돌린 보드와 조작할 위치가 담긴 리스트를 인자로 받아,
 * 규칙에 따라 점수를 반환하는 함수
 *
 * @param {number[][]} rotateBoard 오른쪽으로 90도 돌린 보드
 * @param {number[]} MOVE_LIST 조작할 위치가 담긴 리스트
 * @returns {number} 점수
 */
function getScore(rotateBoard, MOVE_LIST) {
  let stack = [];
  let score = 0;

  for (const MOVE of MOVE_LIST) {
    const SELECT_ROW = MOVE - 1;

    // 비어있는 곳 선택시 점수 1점 감소
    if (rotateBoard[SELECT_ROW].length === 0) {
      score -= 1;
      continue;
    }

    const SELECT_PUZZLE = rotateBoard[SELECT_ROW].pop();

    // 스택이 비어있으면 선택한 퍼즐 바로 push
    if (stack.length === 0) stack.push(SELECT_PUZZLE);
    else {
      // 스택이 비어있지 않으면
      // 스택의 top과 같은 것을 선택했을 시 스택에서도 pop해주고 점수 * 2를 더해줌
      if (stack.at(-1) === SELECT_PUZZLE) score += stack.pop() * 2;
      // top과 같지 않으면 그냥 push
      else stack.push(SELECT_PUZZLE);
    }
  }

  return score;
}

function solution() {
  let board = [
    [0, 0, 0, 0],
    [0, 1, 0, 3],
    [2, 5, 0, 1],
    [2, 4, 4, 1],
    [5, 1, 1, 1],
  ];
  const MOVE_LIST = [1, 1, 1, 1, 3, 3, 3];

  let rotateBoard = getRotateBoard(board);
  const SCORE = getScore(rotateBoard, MOVE_LIST);

  console.log(SCORE);
}

solution();