2차원 배열 board를 탐색하는 문제입니다.
board 배열을 게임 화면처럼 N x N 크기의 정사각 격자 형태로 만들어 보면
다음과 같은 모양이 됩니다.
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]
]
moves 배열을 통해 board의 각 원소인 배열 중 몇 번째 원소에 접근해야 할 지 알 수 있습니다.
moves의 0번 째 원소를 N이라고 한다면, board안의 각 배열 N번 째 에서 0을 제외한 마지막 원소에 접근하여 basket배열로 값을 넣어주면 됩니다.
basket 배열에 순서대로 쌓인 원소가 연속으로 2개가 같을 경우 두 원소를 모두 제거합니다.
그리고 문제의 기댓값인 사라진 인형의 개수를 result라는 변수를 만들어 +2를 해줍니다.
function solution(board, moves) {
const basket = [];
let result = 0;
moves.forEach(order => {
const doll = pickup(board, order-1);
if(doll){
if(basket[basket.length-1] === doll){
basket.pop();
result +=2;
}else{
basket.push(doll);
}
}
});
return result;
}
function pickup(board, order){
for(let i = 0; i < board.length ; i++){
if(board[i][order] !== 0){
const doll = board[i][order];
board[i][order]= 0;
return doll;
}
}
}
function solution(board, moves) {
let answer = 0;
let count = moves.length; // 움직일 횟수
let col = board.length; // 현재 board의 col수
let bascket = []; // 뽑은 인형 쌓는 바구니
let lastItem = 0; // 바구니의 마지막 인덱스
for (let i = 0; i < count; i++) {
let selected = moves[i] - 1; // 선택되어진 열
let pick = 0; // 뽑은 인형
// 해당 열에서 가져올 인형 (0은 인형없는 빈칸)
for (let j = 0; j < col; j++) {
if (board[j][selected] !== 0) { // 뽑힌 인형
pick = board[j][selected];
lastItem = bascket.length - 1; // 바구니의 맨 위 인형
if (pick === bascket[lastItem]) { // 뽑힌 인형 = 바구니의 맨 위 인형
bascket.pop(); // 바구니 마지막 인형 제거
answer += 2; // 점수 추가
} else {
bascket.push(pick); // 바구니 맨 위로 추가
}
board[j][selected] = 0; // 선택 된 인형위치는 빈칸
break; // 해당 루프에서 벗어나기
}
}
}
return answer;
}