KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (507) N
    • CS (1)
    • Web (29) N
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • Next.js (5) N
      • ETC (1)
    • Docker (14)
    • Git (5)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • codeup
  • 수학
  • tree
  • Level 0
  • 백준
  • Level 1
  • 다이나믹 프로그래밍
  • C
  • LeetCode
  • 그래프
  • string
  • 정렬
  • C++
  • recursion
  • Level 2
  • Level1
  • 문자열
  • programmers
  • 제코베 JS 100제
  • js

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

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

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

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();
저작자표시 (새창열림)

'PS > 제코베 JS 100제' 카테고리의 다른 글

제코베 JS 100제 / 99 / 토끼들의 행진  (0) 2022.10.14
제코베 JS 100제 / 98 / 청길이의 패션 대회  (0) 2022.10.14
제코베 JS 100제 / 97 / 택배 배달  (1) 2022.10.14
제코베 JS 100제 / 96 / 넓은 텃밭 만들기!  (0) 2022.10.10
    'PS/제코베 JS 100제' 카테고리의 다른 글
    • 제코베 JS 100제 / 99 / 토끼들의 행진
    • 제코베 JS 100제 / 98 / 청길이의 패션 대회
    • 제코베 JS 100제 / 97 / 택배 배달
    • 제코베 JS 100제 / 96 / 넓은 텃밭 만들기!
    KimMinJun
    KimMinJun

    티스토리툴바