[프로그래머스] 크레인 인형뽑기 게임 | JavaScript

Hemudi | Hemdi·2021년 11월 13일
0

🧨 코딩테스트

목록 보기
11/19
post-thumbnail

NxN의 정사각형의 인형뽑기 기계에서 인형을 뽑아 바구니에 넣은 뒤 바구니에 동일한 인형이 연속으로 쌓일 경우 제거하는 게임
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.


✳️ 제한사항

  • board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
  • 0은 빈 칸을 나타냅니다.
  • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

✳️ 입출력 예

boardmovesresult
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]][1,5,3,5,1,2,1,4]4

✳️ 내가 푼 코드

function solution(board, moves) {
    var answer = 0;
    let basket = [];

    for(const move of moves){
        for(let depth = 0; depth < board[move - 1].length; depth++){
            if(board[depth][move-1] != 0){
                basket.push(board[depth][move-1]);
                board[depth][move-1] = 0;
                break;
            }
        }

        if(basket.length >= 2){
            if(basket[basket.length - 1] === basket[basket.length - 2]){
                basket.pop();
                basket.pop();
                answer += 2;
            }
        }
    }
    
    return answer;
}

✳️ 생각 정리

move
depth00000
00103
02501
42442
35131
  • moves 배열을 순회
  • board[m][n] 일때 m을 depth, n을 move 로 보고 depth 를 순회
    • 0 인 경우 그냥 지나가고 0이 아닌 경우 해당 값을 basket 에 push 후 0으로 변경
      • break 로 depth 순회 끝
  • basket 의 길이가 2 이상인 경우
    • 제일 끝의 값 2개를 비교해서 같으면 2번 pop
    • 제거한 횟수 카운트 + 2

* depth 탐색하는 안쪽 for문을 재귀로 구현하면 굳이...싶을까?

* pop 을 두번 반복하는 부분의 코드가 중복되는게 너무 신경쓰인다...

  • 게더에서 코드 리뷰 받고 pop 을 두번 하는것보다 splice() 를 쓰는것도 좋다는 피드백을 받았다!!!
    • slice(), splice()
profile
'햄디'로 현재 코드스쿼드 코코아 과정 수강 중 💻 (티스토리로 이전)

0개의 댓글

관련 채용 정보