## 🌟 문제
[코딩테스트 연습 - 크레인 인형뽑기 게임 \| 프로그래머스 스쿨](https://school.programmers.co.kr/learn/courses/30/lessons/64061)
크레인으로 인형을 뽑아 바구니에 쌓을 때, 같은 인형이 연속으로 2개 쌓이면 터뜨려진다. 모든 moves를 실행한 후 터진 인형의 개수를 return하기.
## 🌟 풀이
우선 board를 사용하기 쉬운 자료 구조로 바꿔줬다. 크레인은 각 열의 맨 위 인형만 집을 수 있기 때문에 각 열을 개별 스택으로 관리하면 인형을 꺼내는 작업을 O(1)에 처리할 수 있다.
```javascript
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씩 늘어나야 한다.)
```javascript
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);
}
}
```
> [!tip] board를 좀 더 효율적으로 다루는 방법
> 인형을 뽑을 때마다 pop해서 board 데이터를 직접 변경하는 방법도 있지만, top index만 저장해서 top index를 증가시켜주는 방식으로 pop과 비슷한 효과를 낼 수도 있다.
> 참고 : [크레인\_인형뽑기\_게임.js · yoouyeon/algorithm\_study · GitHub](https://github.com/yoouyeon/algorithm_study/blob/340011a9adf44b5a3ba86783b6bb49ae88b08e19/Programmers/Level1/64061_%ED%81%AC%EB%A0%88%EC%9D%B8_%EC%9D%B8%ED%98%95%EB%BD%91%EA%B8%B0_%EA%B2%8C%EC%9E%84.js#L9-L54)