64061. 크레인 인형뽑기 게임

2025-12-03
프로그래머스 64061번 풀이

이 글은 Obsidian에서 마이그레이션되었으며, 그 과정에서 AI의 도움을 받았습니다. 오류나 누락된 내용이 있다면 댓글로 알려주세요!

문제

코딩테스트 연습 - 크레인 인형뽑기 게임 | 프로그래머스 스쿨

풀이

아이디어

우선 board를 사용하기 쉬운 자료 구조로 바꿔줬다. 크레인은 각 열의 맨 위 인형만 집을 수 있기 때문에 각 열을 개별 스택으로 관리하면 인형을 꺼내는 작업을 O(1)에 처리할 수 있다.

const boardStack = Array.from({ length: board.length }, () => new Array());
board.reverse().forEach((row) => {
  for (let idx = 0; idx < row.length; idx++) {
    row[idx] && boardStack[idx].push(row[idx]);
  }
});

그 다음에는 moves를 순회하며 인형을 뽑아준다. moves에서 각 위치에서 인형을 꺼내고 (pop) basket의 맨 위 인형과 같으면 터뜨려주면 된다. (주의 : 구해야 하는 것은 터지는 횟수가 아닌 터지는 인형의 개수이므로 터질 때 마다 정답이 2씩 늘어나야 한다.)

const basket = [];
let answer = 0;
for (let idx = 0; idx < moves.length; idx++) {
  const target = boardStack[moves[idx] - 1].pop();
  if (!target) continue;
  if (basket.length > 0 && target === basket[basket.length - 1]) {
    basket.pop();
    answer += 2;
  } else {
    basket.push(target);
  }
}

board를 좀 더 효율적으로 다루는 방법: 인형을 뽑을 때마다 pop해서 board 데이터를 직접 변경하는 방법도 있지만, top index만 저장해서 top index를 증가시켜주는 방식으로 pop과 비슷한 효과를 낼 수도 있다.