Bleeding edge

[프로그래머스] 크레인 인형뽑기 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 크레인 인형뽑기 - 자바스크립트

codevil 2022. 7. 21. 10:37

https://school.programmers.co.kr/learn/courses/30/lessons/64061

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

처음에 봤을 때 이 문제가 레벨1이라니! 하고 놀랬었던 문제.. 지금 와서 보니 레벨 1 맞는거 같은게 엄청 크게 고민해야할 것보다는 구현 로직이 상당히 심플하다. 단지 2차원을 쓰는게 익숙하지 않아서 어렵다고 생각이 들었던거 같다.

문제 로직은 상당히 심플하다 board와 move 두가지가 주어진다.

1. board에 있는걸 move에 있는 순서대로 한개씩 0으로 만들어준다.

2. 0으로 만든 숫자는 queue에 넣는다

2-1 만일 queue의 맨 위에 있는 숫자와, 넣을 숫자가 같다면 넣지 않고 queue를 pop시킨다.

2-2 sum을 더한다(sum은 함수 맨처음에 선언해야한다)

 

1. 함수를 두개로 나누어 풀이를 했다. 우선, board에 있는 인형을 받는 함수를 만들었다

board는 실시간으로 업데이트가 되야하기 때문에, board를 return해야한다. 그리고, 인형이 빈칸인지 아닌지 구분하여, 빈칸이면 -1 숫자가 있다면 제거한 숫자를 return 한다

2. 전체함수를 작성한다

function solution(board, moves) {
     let sum = 0
    let queue = []
    let arrangedDoll = -1
    for(let i=0;i<moves.length;i++){
        [board, arrangedDoll] = pickUpDoll(board, moves[i]) 
	//새로 작성이 필요한 곳
    }
}

 

 

이제, board와 arrangedDoll을 업데이트가 가능하다. 콘솔을 찍어보면 board의 변화와, 인형이 어떤것이 튀어나왔는지 알 수 있다.

3. 만일 queue의 맨 위에 있는 숫자와, 넣을 숫자가 같다면 넣지 않고 queue를 pop시킨다.의 로직을 가진 함수를 작성한다

function removeDoll(queue, pickedDoll, sum){
    if(queue.length===0){
    queue.push(pickedDoll)
    return [queue, sum]        
    }else{
        const highestDoll = queue[queue.length-1]
        if(highestDoll===pickedDoll){
            queue.pop()
            return [queue, sum+2]
        }else{
            queue.push(pickedDoll)
            return [queue, sum]
        }
    }
    queue.push(pickedDoll)    
    return [queue, sum]
}

queue를 항상 업데이트하고, 몇 개를 제거했는지 update가 가능해졌다.

 

4. 전체식에서 sum을 업데이트한다

function solution(board, moves) {
     let sum = 0
    let queue = []
    let arrangedDoll = -1
    for(let i=0;i<moves.length;i++){
        [board, arrangedDoll] = pickUpDoll(board, moves[i]) 
        if(arrangedDoll !== -1){
            [queue, sum] = removeDoll(queue, arrangedDoll, sum)
        }
    }
    return sum
}

 

전체 풀이

function solution(board, moves) {
     let sum = 0
    let queue = []
    let arrangedDoll = -1
    for(let i=0;i<moves.length;i++){
        [board, arrangedDoll] = pickUpDoll(board, moves[i]) 
        if(arrangedDoll !== -1){
            [queue, sum] = removeDoll(queue, arrangedDoll, sum)
        }
    }
    return sum
}
function removeDoll(queue, pickedDoll, sum){
    if(queue.length===0){
    queue.push(pickedDoll)
    return [queue, sum]        
    }else{
        const highestDoll = queue[queue.length-1]
        if(highestDoll===pickedDoll){
            queue.pop()
            return [queue, sum+2]
        }else{
            queue.push(pickedDoll)
            return [queue, sum]
        }
    }
    queue.push(pickedDoll)    
    return [queue, sum]
}
function pickUpDoll(board, number){
    number--
    if(board[board.length-1][number]===0) return [board, -1]
    for(let i=0;i<board.length;i++){
        if(board[i][number]!==0){
            const arrangedDoll = board[i][number]    
           board[i][number]=0
            return [board, arrangedDoll]
       }
    }
    return [board, -1]
}

함수를 찢어서 푸니 어디서 문제가 생겼는지 찾는게 쉬워졌다. 이제 레벨1은 모두 풀었으니 레벨2로 다시!