프로그래머스 인형뽑기
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];
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차워 배열의 문제를 풀 때 배운 내용을 적용해보자.