import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
// 크레인으로 뽑아서 인형을 넣으면 -> 그 공간은 위아래방향으로 '쌓인다.'
// -> stack.
// 현재 board 상태를 시각화하는 코드
ArrayDeque<Integer> stack = new ArrayDeque<>(); // moves를 통해서 열을 지정해서 (1~5)
int answer = 0; // 같은 것이 '펑'한 횟수
// System.out.println(stack);
// for (int[] b : board) {
// for (int i : b) {
// System.out.print(i);
// }
// System.out.println();
// }
// 크레인의 움직임
for (int move : moves) {
// System.out.println("뽑는 열 : " + move);
// 열 -> move 인덱스 / board.length -> 얼마나 가로줄에 겹쳐있는지
for (int row = 0; row < board.length; row++) {
// if (board[row][move - 1] == 0) { // move는 1부터 시작하고, index는 0부터...
// // == 0 => 비어있다
// continue; // 다음 줄로 넘어가기
// }
if (board[row][move - 1] != 0) {
// 0이 아닌 값을 발견하면 -> 들어올릴 인형이 있다
// 그 인형 값이 곧 'board[row][move - 1]'
// ** 답을 내기 위해서는 여기를 수정 **
// 2가지 상황
// 1. 새롭게 넣은 인형과 기존의 가장 끝(peek) 인형이 동일하다
// => 가장 끝 인형과 새롭게 넣은 인형을 터트려버린다 (추가X, 끝점X)
// 2. 동일하지 않거나, 아예 stack이 비어있다
// => 그냥 쌓는다 (추가한다)
int doll = board[row][move - 1];
// System.out.println("이번에 뽑음 : " + doll);
// System.out.println("직전에 뽑힘 : " + stack.peek());
// !stack.isEmpty() -> stack.peek()이 null일 경우를 배제
if (!stack.isEmpty() && doll == stack.peek()) {
// System.out.println("펑!");
stack.pop(); // 직전 거를 삭제만..
answer+=2; // 짝을 맞춰서 2개 사라짐
// System.out.println("사라진 인형 수 : " + answer);
} else {
stack.push(board[row][move - 1]);
// 크레인으로 집어올린 건 stack에 넣고
}
board[row][move - 1] = 0; // 그 자리를 0으로 만들어준다
break; // 그러고 반복 멈춤
}
}
// System.out.println(stack);
// for (int[] b : board) {
// for (int i : b) {
// System.out.print(i);
// }
// System.out.println();
// }
}
// answer 결과 -> 똑같은 것이 2개 겹치면... 터트리고 그 자리를 좁혀서 시작...
return answer;
}
}