문제가 너무 길어서 생략,,
board배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
moves배열의 크기는 1 이상 1,000 이하입니다.moves배열 각 원소들의 값은 1 이상이며board배열의 가로 크기 이하인 자연수입니다.

- 입출력 예 #1 : 인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.
처음에 문제를 잘못 이해해서 각 행에 해당하는 배열이 한 칸에 들어간 인형의 종류인 줄 알고 풀었는데.. 제출만 하면 자꾸 다 실패하는거임.. 테스트 케이스는 통과했는데..
알고보니 각 행이 말 그대로 격자의 한 행이였던거임 ^^.. 분명 처음 이해한대로 테스트 케이스 풀었을 때 답이 나왔는데 말이죠.. 저거 땜에 거의 한 시간을 고민한게 너무.. 킹받는다..
✅ 게임판의 가로 크기를
n에 저장하고, 크기가n인 배열cnt를 선언하여 각 칸에 들어있는 인형의 개수를 저장해주었다.
인형을 꺼낸 순서대로 바구니에 넣는데, 가장 마지막에 넣은 인형과 현재 넣을 인형이 같으면 깨야 하므로 마지막에 넣은 인형을 꺼내기 편하게 바구니를 스택s로 구현하였다.
인형을 뽑을 칸(열)idx는moves[i]-1이고, 해당 칸에서 뽑혀야 할 인형의 위치(행)는cnt[n-idx]이다. 이때,cnt[idx] = 0인 경우에는 뽑을 인형이 없으므로 continue를 통해 건너뛴다.
바구니가 비어있거나 마지막에 넣은 인형이 현재 넣을 인형crane과 다른 경우에는 인형을 바구니에 넣고, 마지막에 넣은 인형이crane과 같으면 바구니에서 마지막에 넣은 인형을 꺼내고 깨진 인형의 개수answer를 2 증가시킨다. (꺼낸 인형 + 넣을 예정이였던 인형) 해당 과정을 모두 수행했다면 인형은 이번 차례에 사용된 것이므로cnt[idx]--를 수행한다.
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int n = board.length;
int[] cnt = new int[n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(board[i][j] != 0) cnt[j]++;
}
}
Stack<Integer> s = new Stack<>();
int answer = 0;
for(int i=0;i<moves.length;i++) {
int idx = moves[i] - 1;
if(cnt[idx] <= 0) continue;
int crane = board[n-cnt[idx]][idx];
if(s.empty() || s.peek() != crane) s.push(crane);
else {
s.pop(); answer += 2;
}
cnt[idx]--;
}
return answer;
}
}
