이번 문제는 설명과 특히 제공되는 그림이 많아서 문제에 대한 설명대신 문제 링크를 걸고 정답 코드와 코드설명만 적기로 결정했다.
문제링크
function solution(board, moves) {
const basket = [];
let score = 0;
moves.forEach((move) => {
let doll = 0;
for (let row = 0; row < board.length; row++) {
if (board[row][move - 1] !== 0) {
doll = board[row][move - 1];
board[row][move - 1] = 0;
break;
}
}
if (doll === 0) return;
if (basket.length === 0) {
basket.push(doll);
} else {
if (basket[basket.length - 1] === doll) {
basket.pop();
score += 2;
} else {
basket.push(doll);
}
}
});
return score;
}
이번 문제에 핵심은 스택을 활용하는 것이다.
인형을 담을 basket 변수 스택으로 활용할 것이다.
score는 전체 사라진 인형 숫자 값이다.
매개변수로 전달되는 moves는 크레인을 작동시킨 위치가 담긴 배열인데 결국 moves 배열 길이만큼 동작을 수행해야 한다. 따라서 forEach로 moves 배열 길이만큼 순회하면서 내부에서 뽑은 인형의 모양을 저장할 변수 doll을 선언 후 0으로 초기화해준다.
그다음 각각의 forEach 순회 중에 인형 위치가 담긴 배열 board를 board의 행 길이만큼 탐색하는데 세로로 탐색하므로 행은 고정이기 때문에 board[row]이고 그다음 move 배열은 위치를 1번 2번으로 나타내지만 인덱스는 0번부터이므로 - 1을 해준 값을 열의 위치로 사용해
준다.
0은 빈칸을 나타내므로 빈칸이 아닐 경우에만 뽑은 인형의 번호를 doll 변수에 저장 후 뽑은 위치에 0을 할당하고 반목문을 빠져나온다. 아래에서 현재 인형을 담은 basket에 인형이 없으면 무조건 push를 하고 인형이 존재한다면 최상위에 인형 모양을 나타내는 값과 뽑았던 인형 모양 값 doll과 비교하여 같으면 push 하지 않고 사라지기 때문에 기존 basket에 있던 인형을 pop 하고 사라진 인형 개수를 나타내는 score 변수에 2를 더해준다.
중간에 if (doll === 0) return;문의 역할은 예를 들어 1번 라인을 탐색하였는데 인형이 없으면 doll 값이 0일 것이다. 그런데 basket에는 0을 push 하면 안 되기 때문에 추가해 준 조건이다.
마지막에 총 사라진 개수를 return 한다.