문제가 너무 길어서 생략,,
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;
}
}