앞부분 생략
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개 변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해 주세요.
board
배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.board
의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
moves
배열의 크기는 1 이상 1,000 이하입니다.moves
배열 각 원소들의 값은 1 이상이며board
배열의 가로 크기 이하인 자연수입니다.
board | moves | result |
---|---|---|
[[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]] | [1,5,3,5,1,2,1,4] | 4 |
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack <Integer> stack = new Stack<>();
for(int i = 0; i < moves.length; i++){
for(int j = 0; j < board.length; j++){
if(board[j][moves[i]-1] != 0) {
if(stack.empty() || stack.peek() != board[j][moves[i]-1])
stack.add(board[j][moves[i]-1]);
else if(stack.peek() == board[j][moves[i]-1]){
answer += 2;
stack.pop();
}
board[j][moves[i]-1] = 0;
break;
}
}
}
return answer;
}
}
💡 뽑은 인형들을 저장하기 위한 것으로 스택을 사용하였다 -> 맨 위에 있는 인형(정수)을 제거하기에 용이하기 때문에 ❕
💡
move
배열에 담긴 원소의 순서대로 격자 칸에 가야 하는데, 해당 격자 칸의 수가 0이 아닐 때, 즉 인형이 있는 경우에 스택이 빈 상태이거나 스택의 맨 위에 있는 원소가 추가하려는 정수와 같지 않다면 스택에 push를 해 주면 된다 하지만, 스택이 비지 않았으며 스택의 top에 있는 원소와 추가하려는 정수가 같다면 두 개의 인형이 터지게 되며answer
에 +2를 해 주고, top에 있는 정수를 pop 해서 없어지게 해 주었다 이후 격자 칸에서 인형을 처리한 자리에는 0으로 빈칸으로 표시해 주며 한 칸에서 인형을 뽑았으면 더 뽑을 수 없으므로 break로 해당 반복문을 멈추고move
배열의 원소에 따라 다음 칸으로 갈 수 있게 해 준다
풀기 전엔 좀 막막해 보였는데 생각보다 빨리 풀린 문제 🤩