[프로그래머스] JS - 인형뽑기 (2차원 배열 행과 열 바꾸기)

sarang_daddy·2023년 2월 1일
0

문제

프로그래머스 인형뽑기
2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

const board = [
  [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],
];
const moves = [1, 5, 3, 5, 1, 2, 1, 4];

제한조건

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

나의 풀이

function solution(board, moves) {
  var answer = 0;

  const stack = []; // 뽑힌 인형이 담길 스택

  for (let m = 0; m < moves.length; m++) {
    for (let i = 0; i < board.length; i++) {
      let j = moves[m] - 1;
      let doll = board[i][j]; // 이중 for문으로 탐색하며 j값에 moves값을 준다.

      if (doll !== 0) { // 탐색 중 인형이 있다면 
        if (stack[stack.length - 1] === doll) { // 스택에 같은 인형이 있다면
          stack.pop(); // 스택 최상단을 빼준다.
          answer += 2; // 탐색된 인형과 스택 최상단 인형 +2
        } else stack.push(doll); // 스택 최상단에 동일 인형이 없으면 푸쉬
        board[i][j] = 0; // 뽑힌 인형은 제거한다.
        break;
      }
    }
  }

  return answer;
}

다른 사람 풀이

// 2차원 배열의 행과 열을 바꾼다.
const transpose = matrix =>
    matrix.reduce((result, row) => row.map((_, i) => [...(result[i] || []), row[i]]),[]); 

const solution = (board, moves) => {
    // 바뀐 행과 열의 2차원 배열에서 "0"을 제거하고 뒤집는다. (pop으로 인형을 뽑기위해)
    const stacks = transpose(board).map(row => row.reverse().filter(el => el !== 0));
    const basket = [];
    let result = 0;

    for (const move of moves) {
        // moves에 해당하는 열의 인형을 pop한다.
        const pop = stacks[move - 1].pop();
        if (!pop) continue;
        if (pop === basket[basket.length - 1]) {
            basket.pop();
            result += 2;
            continue;
        }
        basket.push(pop);
    }

    return result;
};

transpose라는 함수가 매우 흥미로워 가져오게 되었다.

  • 2차원 배열의 행과 열을 바꿔주는 코드

자세한 내용은 아래 사이트에 친절하게 정리해 주었다.
Transposing a 2D-array in JavaScript

주어진 문제를 고정하고 푸는 방법 말고도 문제를 풀기 쉽게 문제 형태 자체를 바꾸는 시야에 놀랐다.
2차워 배열의 문제를 풀 때 배운 내용을 적용해보자.

profile
한 발자국, 한 걸음 느리더라도 하루하루 발전하는 삶을 살자.

0개의 댓글