[카카오] 크레인 인형뽑기 게임(프로그래머스)

정승옥(seungok)·2020년 12월 11일
0

프로그래머스

목록 보기
21/40
post-thumbnail

문제설명

  • 게임 화면은 NxN 크기, 위쪽에 크레인, 오른쪽에 바구니
  • 1x1 크기의 격자에 인형 하나가 차지하며 격자의 가장 아래 칸부터 쌓여있음
  • 인형의 종류는 다양함
  • 크레인으로 집어올린 인형들은 바구니의 가장 아래 칸부터 순서대로 쌓여짐
  • 바구니에서 같은 종류의 인형이 연속으로 쌓이면 두 인형은 사라지게 됨
  • 크레인 작동 시 인형이 집어지지 않는 경우는 없으나 인형이 없을 경우 아무런 일도 일어나지 않음
  • 격자의 상태가 담긴 2차원 배열 board, 크레인 작동 위치가 담긴 배열 moves
  • 크레인을 모두 작동시킨 후 사라진 인형의 개수 구하기

제한사항

  • 2차원 배열 board의 크기는 5x5이상 30x30이하
  • board의 각 칸에는 0이상 100이하 정수가 담겨있음
  • 0은 빈칸, 1~00은 각기 다른 인형이며 같은 숫자는 같은 종류의 인형
  • moves 배열의 크기는 1이상 1,000이하
  • moves 배열의 각 원소들의 값은 1이상이며 board 배열의 가로 크기 이하인 자연수

풀이

function solution(board, moves) {
    // 크레인으로 옮긴 인형들이 담긴 배열 bucket
    // 같은 인형이 연속으로 옮겨져 인형이 사라진 횟수 count
    // 크레인이 인형을 해당 위치에서 인형을 집었는지 확인 check
    let bucket = [];
    let count = 0;
    let check;
    
    for(let i=0;i<moves.length;i++){
        // check의 기본값은 false
        check = false;
        for(let j=0;j<board.length;j++){
            // 빈 격자가 아닐경우(인형이 있는 격자)
            // 배열 bucket에 집은 인형을 넣음
            // 인형이 있던 위치의 격자는 빈 격자(0)으로 변경
            // check를 true로 바꿔 해당 위치 인형을 추가로 옮김을 막음
            if(!check){
                if(board[j][moves[i]-1] !== 0){
                    bucket.push(board[j][moves[i]-1]);
                    board[j][moves[i]-1] = 0;
                    check = true;
                }
            }else
                continue;
            // 배열 bucket에 닮긴 인형이 2개 이상일 경우
            // 연속해서 담긴 인형들이 있을때 두개 인형을 배열에서 삭제함
            // 사라진 횟수 count 증가
            if(bucket.length>1){
                for(let i=0;i<bucket.length;i++){
                    if(bucket[i] === bucket[i+1]){
                        bucket.splice(i,2);
                        ++count;
                    }
                }
            }
        }
    }
    // 사라진 인형의 갯수는 사라진 횟수의 2배
    return count * 2;
}

체크포인트

  • 천천히 풀면 결국 풀린다
profile
Front-End Developer 😁

0개의 댓글