function solution(board, moves) {
// 바구니
let stack = [];
// 터뜨려서 사라진 인형의 개수
let count = 0;
outer:for(let i = 0; i < moves.length; i++){
// 크레인의 위치
// 0번 인덱스가 크레인이 1일 때이므로 연산 진행시 주의!
// 2차원 배열인 board[i][j]에서 j에 해당하는 위치를 결정하는 것이기도 하다.
let crane = moves[i];
inner:for(let j = 0; j < board.length; j++){
// 인형이 선택되는 위치
let doll = board[j][crane - 1];
// 0이 나온다면 더 아래로 들어가야한다.
// 즉, j를 증가시켜야하므로 continue
if(doll === 0){
continue inner;
} else {
// 크레인으로 잡아올린 인형을 바구니에 넣는다.
stack.push(doll);
// 인형이 사라졌으므로, 0을 넣어준다.
board[j][crane - 1] = 0;
// 크레인으로 넣어준 doll(stack[stack.length - 1])과
// stack 가장 윗 부분에 있었던 doll(stack[stack.length - 2])이 같다면
// 두 개를 터뜨려준다.(삭제한다)
if(stack.length > 1){
if(stack[stack.length - 2] === stack[stack.length - 1]){
stack.pop();
stack.pop();
// 인형이 두 개 연속으로 올 때만 삭제되므로
// 2를 증가시킨다.
count += 2;
}
}
// 인형을 뽑아서 크레인으로 옮겼으므로
// 다음 크레인 동작을 준비한다
break inner;
}
}
}
return count;
}
40분 정도 걸려서 풀었다.
문제 예시부터가 스택 구조를 이용하라는 강한 뉘앙스를 풍긴다.
이건 주석을 따라 읽어나가면 이해가 편할 것이다.
다른 분 풀이 중 가장 유명했던 것이, 2차원 배열의 열과 행을 바꿔서 어찌저찌 푸는 것이었는데,
도저히 이해가 안되서 가져오는 것은 그만두었다.