프로그래머스 - 크레인 인형뽑기 게임

picture 22

크레인 인형뽑기 게임

function solution(board, moves) {
  const _board = Array(board.length)
    .fill(null)
    .map(() => Array())

  const stack = Array()
  let result = 0

  board.reverse().forEach(line => {
    line.forEach((element, idx) => {
      if (element !== 0) {
        _board[idx].push(element)
      }
    })
  })

  moves.forEach(x => {
    const pop = _board[x - 1].pop()
    if (pop) {
      if (pop === stack[stack.length - 1]) {
        stack.pop()
        result += 2
      } else stack.push(pop)
    }
  })

  return result
}
첫 풀이 베스트 풀이 개선된 풀이
0.27ms 0.19ms 0.18ms
0.28ms 0.19ms 0.12ms
0.16ms 0.20ms 0.17ms
0.27ms 0.21ms 0.59ms
0.24ms 0.22ms 0.16ms
0.21ms 0.27ms 0.18ms
0.81ms 0.43ms 0.15ms
0.58ms 0.43ms 0.32ms
0.92ms 0.46ms 0.33ms
0.64ms 0.47ms 0.32ms
0.94ms 0.63ms 0.42ms

최초 풀이 과정

  1. 2차원 배열을 생성하고
  2. 보드의 인형들을 2차원 배열에 스택한다

    1. 보드를 뒤집어서 아래부터 쌓는다
    2. 스택시 빈 공간(0)은 스킵한다
  3. moves에 따라 인형들을 pop하여 다른 배열에 스택한다.
  4. stack을 반복순회한다.

    1. 인접한 인형과 같은 경우 -1로 변경한다.
    2. -1이 된 인형을 삭제한다.
    3. 삭제 플래그가 false로 유지되는 경우 반복을 중지한다.

다듬을 수 있는 사항

  • 쓸모없는 변수, 구문 삭제
  • moves를 굳이 map으로 하나씩 뺄 필요가 있을까? 그냥 -1만 해도 될 듯 하다.
  • 순서 3에서 인형을 비교하지 않고 전부 다 쌓은 후에 삭제를 하는 방식

    • 쌓고 터지는 과정에서 놓치는 인형이 있지 않을까 하는 고민때문이었다.
    • 베스트 풀이를 보고 잘 생각해보니 해당 문제의 케이스에서는 그럴 일이 없다.
    • 해당 부분을 줄이면 다이어트가 가능하다.
  • 현재 빈배열에서 pop을 하는 경우를 막고 있는데 JS는 빈배열에 pop을 했을 때 에러가 나는 것이 아니라 undefined를 뱉는다.

    • 해당 사례에서 undefined를 검사해서 하는 것이 로직이 간단해질 듯

고민 사항

  • 사용하는 변수 및 자료형을 상위로 옮기는게 좋은가 아니면 사용하는 곳에 선언하는 것이 좋을까?

    • 전체적으로 쓰는 변수들은 위로
    • 지역적으로 쓰는 변수는 아래에서 써도 무방할 듯

Written by@박대성

독서와 지식관리에 관심이 많은 개발자

GitHub