[프로그래머스 | Javascript] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임

박기영·2022년 9월 13일
0

프로그래머스

목록 보기
42/159
post-custom-banner

solution

function solution(board, moves) {
    // 바구니
    let stack = [];
    
    // 터뜨려서 사라진 인형의 개수
    let count = 0;
    
    outer:for(let i = 0; i < moves.length; i++){
        // 크레인의 위치
        // 0번 인덱스가 크레인이 1일 때이므로 연산 진행시 주의!
        // 2차원 배열인 board[i][j]에서 j에 해당하는 위치를 결정하는 것이기도 하다.
        let crane = moves[i];
    
        inner:for(let j = 0; j < board.length; j++){
            // 인형이 선택되는 위치
            let doll = board[j][crane - 1];
        
            // 0이 나온다면 더 아래로 들어가야한다.
            // 즉, j를 증가시켜야하므로 continue
            if(doll === 0){
                continue inner;
            } else {
                // 크레인으로 잡아올린 인형을 바구니에 넣는다.
                stack.push(doll);
            
                // 인형이 사라졌으므로, 0을 넣어준다.
                board[j][crane - 1] = 0;
            
                // 크레인으로 넣어준 doll(stack[stack.length - 1])과
                // stack 가장 윗 부분에 있었던 doll(stack[stack.length - 2])이 같다면
                // 두 개를 터뜨려준다.(삭제한다)
                if(stack.length > 1){
                    if(stack[stack.length - 2] === stack[stack.length - 1]){
                        stack.pop();
                        stack.pop();
                    
                        // 인형이 두 개 연속으로 올 때만 삭제되므로
                        // 2를 증가시킨다.
                        count += 2;
                    }
                }
                
                // 인형을 뽑아서 크레인으로 옮겼으므로
                // 다음 크레인 동작을 준비한다
                break inner;
            }
        }
    }
    
    return count;
}

40분 정도 걸려서 풀었다.
문제 예시부터가 스택 구조를 이용하라는 강한 뉘앙스를 풍긴다.
이건 주석을 따라 읽어나가면 이해가 편할 것이다.

다른 분 풀이 중 가장 유명했던 것이, 2차원 배열의 열과 행을 바꿔서 어찌저찌 푸는 것이었는데,
도저히 이해가 안되서 가져오는 것은 그만두었다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글