본문 바로가기
공부/알고리즘&코딩테스트

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

by 야옹아옹 2021. 8. 17.
정말 혼자 풀면서 생각한 것들을 끄적여 놓은 글입니다..

😶 생각해보기

NxN의 배열

인형은 아래부터 칸칸씩 쌓임

멈춘 위치의 가장 위에 있는 인형을 뽑을 수 있다.

바구니에 쌓는다. 바구니도 가장 아래부터 쌓인다 = 스택

같은 모양의 인형이 두개가 동시에 쌓이면? = 바구니에서 사라진다

원하는 리턴값  = 크레인을 모두 작동 시킨뒤 터져서 사라진 인형의 개수

---

크레인 움직임 배열 = moves는 board 2차원 배열의 두번째?칸을 의미한다.

ex ) moves가 3이면 3은 board[x][3]

1. 정해진 위치의 배열의 0이 아닌 값을 뽑는다.

2. 그걸 바구니 스택에 넣기 전에, 바구니 스택의 가장 꼭대기에 있는 값을 peek?해서

지금 가진 숫자와 같은지 확인한다.

3-1. 같다면 push를 하지 말고 그냥 스택을 pop 해버리고 터진 인형수 +2

3-2. 같지 않다면 바구니 스택에 push

크레인 배열이 끝날때까지 반복

🤔 코드생각해보기

정해진 위치의 배열에서 숫자뽑기

그 배열에 for문을 돌려서 0이면 넘기고 0이 아니면 break를 하기

뽑고나서 그 자리를 0으로 만들어줘야함!!!! 안그러면 계속 뽑더라..

 

바구니 스택

만들어져있는 stack 관련 메서드 사용하기. push 라던가.. peek이 있던가?

없어서 그냥 배열의 length를 사용해서 가장 마지막 값을 알아냈다.

 

만약에 하나도 안뽑았을 경우?

그럼 for문이 안도니까 상관없다.

 

0처리를 꼭 해주자.

테스트1 과 2만 실패했다.. 아래는 질문하기에 있던 테스트코드를 가져왔음.

board: [[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]]
moves: [1, 5, 3, 5, 1, 2, 5, 1, 4, 3]
result: 8

 

✨ 코드

function solution(board, moves) {
    var answer = 0;
    let basket = [];
    // moves 만큼 뽑기를 해야한다.
    moves.forEach((move)=>{
      // 해당 move에 속하는 배열에서 0이 아닌 숫자 뽑기
        let doll = 0;
        for(let i=0; i < board[0].length; i++){
            
            if(board[i][move-1] !== 0) {
                doll = board[i][move-1];
                board[i][move-1] = 0;
                break;
            }
        }
        // 뽑은 doll을 바구니에 넣기
        // 바구니의 가장 위에있는 인형하고 지금 인형이 같은지 비교하기
        if(doll === 0 ) return;
        const compare = compareDoll(basket,doll);
        // 같다면 answer + 2하고 pop해주기
        if(compare){
            answer = answer + 2;
            basket.pop();
        }
        else{
            basket.push(doll);
        }
    })
    return answer;
}

// 인형 비교하는 함수
function compareDoll(basket,doll){
    return basket[basket.length-1] === doll ? true : false;
}

🎶 리뷰

테스트코드가 진짜진짜 중요하다는 걸 깨닫고 있다. 정말 거짓말 안치고 잘만들어진 테스트 코드 하나로 왜 

특정 테스트가 통과가 안됬는지 한방에 깨달았다 ㅠㅠ

잘만든 테스트 코드와 콘솔만 있다면 뭐든 해결할 수 있다.. 다음부터는 직접 테스트코드를 작성해서

문제를 해결해야겠다.. 진짜 테스트는 중요하구나.. 왜 TDD를 쓰는지 알것같다.

정수은 0처리가 진짜 중요한것같다.

댓글