13. Crane claw machine game

스택의 LIFO 구조의 이해를 바탕으로 데이터의 상태 변화와 효율적인 처리 방법

algorithm test

13. Crane claw machine game

Sunhyup Lee. (2024). To be a successful candidate for the coding test. goldenrabbit. p.173.

Problem solving

algorithm solving strategy

Converted stack due to input value

Jay Tak

1. 스택을 이용한 접근법

function solution(board, moves) {
  const lanes = [...Array(board[0].length)].map(() => []);

  for (let i = board.length - 1; i >= 0; i--) {
    for (let j = 0; j < board[0].length; j++) {
      if (board[i][j]) {
        lanes[j].push(board[i][j]);
      }
    }
  }
  const bucket = [];

  let answer = 0;

  for (const m of moves) {
    if (lanes[m - 1].length > 0) {
      const doll = lanes[m - 1].pop();

      if (bucket.length > 0 && bucket[bucket.length - 1] === doll) {
        bucket.pop();
        answer += 2;
      } else {
        bucket.push(doll);
      }
    }
  }
  return answer;
}


🧐 Q. lanes 배열이 형성되는 과정에 대해서 살펴보면,

① 첫 번째 열 (lanes[0]):

  • board[4][0] = 3lanes[0].push(3)
  • board[3][0] = 4lanes[0].push(4)
  • board[2][0] = 0 → 아무 것도 안함.
  • board[1][0] = 0 → 아무 것도 안함.
  • board[0][0] = 0 → 아무 것도 안함.


② 두 번째 열 (lanes[1]):

  • board[4][1] = 5lanes[1].push(5)
  • board[3][1] = 2lanes[1].push(2)
  • board[2][1] = 2lanes[1].push(2)
  • board[1][1] = 0 → 아무 것도 안함.
  • board[0][1] = 0 → 아무 것도 안함.


③ 세 번째 열 (lanes[2]):

  • board[4][2] = 1 → lanes[2].push(1)
  • board[3][2] = 4 → lanes[2].push(4)
  • board[2][2] = 5 → lanes[2].push(5)
  • board[1][2] = 1 → lanes[2].push(1)
  • board[0][2] = 0 → 아무 것도 안함.


④ 네 번째 열 (lanes[3]):

  • board[4][3] = 3lanes[3].push(3)
  • board[3][3] = 4lanes[3].push(4)
  • board[2][3] = 0 → 아무 것도 안함.
  • board[1][3] = 0 → 아무 것도 안함.
  • board[0][3] = 0 → 아무 것도 안함.


⑤ 다섯 번째 열 (lanes[4]):

  • board[4][4] = 1lanes[4].push(1)
  • board[3][4] = 2lanes[4].push(2)
  • board[2][4] = 1lanes[4].push(1)
  • board[1][4] = 3lanes[4].push(3)
  • board[0][4] = 0 → 아무 것도 안함.


⑥ 최종 lane 배열 상태

lanes = [
  [3, 4],       // 1열
  [5, 2, 2],    // 2열
  [1, 4, 5, 1], // 3열
  [3, 4],       // 4열
  [1, 2, 1, 3]  // 5열
]


🧐 Q. 왜 board의 마지막 줄을 한번에 쫙 깔지 않았을까??

만약 board의 마지막 행 전체를 한 번에 lanes 배열에 쫙 깔면, 이는 인형뽑기 기계의 가로형 구조 를 의미하게 됩니다. 즉, 각 열이 아니라 마지막 행의 모든 인형들이 동시에 꺼내질 수 있는 구조가 됩니다. 하지만 실제 인형뽑기 기계는 세로형 구조로, 사용자가 1열, 2열 등 특정 열을 선택하여 그 열에서만 인형이 위에서부터 하나씩 차례로 나오는 방식이죠.

이런 방식으로 구현한 이유는 다음과 같습니다:

  1. 인형뽑기 기계의 현실적인 동작을 모방하기 위해:
    • 각 열은 독립적인 스택처럼 쌓이고, 사용자는 특정 열에서 인형을 꺼내게 됩니다.
    • 만약 board의 마지막 행의 인형을 lanes 배열의 한 줄에 쫙 깔면, 열 단위로 인형을 처리할 수 없게 되고, 문제의 요구 사항과 맞지 않게 됩니다.
  2. 선택된 열에서만 인형을 꺼내기 위해:
    • 각 열에 쌓인 인형들만 선택된 순서대로 꺼내야 하므로, 각 열마다 스택을 만들어 인형을 쌓고 관리하는 것이 더 적합합니다.
    • 인형을 꺼낼 때는 다른 열에는 영향을 주지 않고, 오직 선택된 열에서만 인형이 나오게 하는 구조가 필요합니다.