코딩 테스트/프로그래머스(LV1)

[프로그래머스] 크레인 인형뽑기 게임 (LV1 - JavaScript)

dev-hpk 2024. 10. 21. 16:44

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제

 

제한사항

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

입출력 예

boards moves result
[[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

 

입출력 예 설명

입출력 예 #1
인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.

 

2. 정답 풀이

풀이 전략

  • 스택 구조를 활용
  • board를 순회하며 실제 이미지에 인형이 배치된 것처럼 구성된 stack이라는 배열을 만든다.
  • 0은 빈칸이기 때문에 0을 제외한 나머지로 stack을 구성
  • moves 배열을 순회하며 stack[move-1]이 빈 배열이 아니라면(인형이 있는 경우) pop 하고 popValue 변수에 할당한다.
  • popValue를 바구니를 의미하는 pocket 스택에 push 한다.
  • push 할 때 스택의 마지막 값과 추가하려는 값이 같다면(같은 인형인 경우) pocket.pop()을 통해 마지막 값을 제거하고 answer += 2로 삭제된 인형을 2개 추가한다.
function solution(board, moves) {
    let answer = 0
    const BOARD_LENGTH = board.length
    const stack = new Array(BOARD_LENGTH).fill([])
    const pocket = []
    for(let i=0; i<BOARD_LENGTH; i++) {
        for(let j=0; j<BOARD_LENGTH; j++) {
            const num = board[BOARD_LENGTH - 1 - j][i]
            if (num > 0) stack[i] = [...stack[i], num]            
        }
    }
    moves.map(move => {
        const popValue = stack[move-1].length > 0 ? stack[move-1].pop() : -1;
        if(popValue === pocket[pocket.length-1]) {
            pocket.pop()
            answer += 2
        } else if(popValue > -1) {
            pocket.push(popValue)
        }
    })
    return answer
}

 

 

 

느낀 점

  • 문제를 읽고 인형을 추가하고 삭제하는 과정에서 스택 구조가 떠오른 걸 보면, 문제 접근 방식이 성장하고 있는 것 같다.
  • 변수명은 여전히 직관적이지 못한것 같다. 코드 작성할때 신경쓰자!
  • 문제 풀이를 설명할 때도 다른 사람이 이해하기 쉽게 풀어쓰는 연습이 필요할 것 같다..😅