사실 문제 생긴 것만 보고서는 복잡해보였다. 천천히 읽어보니까 '어? 금방 풀겠는데?'싶었다. 문제 설명의 그림을 보자마자 바로 스택이 떠올랐고, 바로 풀이 방식이 떠올랐다.
📍
이중 for문을 사용하여 풀이했다. 수행해야하는 움직임이 들어있는 moves배열의 길이만큼 반복하고, 한 번의 크레인 움직임에서 한칸씩 내려가면서 잡을 인형이 있는지 확인하기 위한 배열이 필요했다.
for(int m : moves){
int col = m-1;
for(int i = 0; i < board.length; i++){
📍
현재 크레인이 위치한 곳의 값이 0이 아닌 값이 들어있다면, 잡을 인형이 있다는 뜻이므로 숫자를 배열에서 빼내서 스택에 넣어준다.
📍
넣기 전에 peek()을 사용하여 현재 크레인이 잡은 숫자와 스택의 top에 위치한 숫자가 같은지 확인한다.
if(!(stack.isEmpty()) && stack.peek()==cur){
answer+=2;
stack.pop();
}
else{
stack.push(cur);
}
board[i][col] = 0;
숫자가 같으면 스택에 넣지 않고 pop()을 수행한다.
숫자가 다르면 스택에 push()를 해준다.
📍
pop() 또는 push()를 한 후 크레인이 위치한 인덱스의 값을 0으로 바꿔준다.
import java.util.Stack;
class Soultion{
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for(int m : moves){
int col = m-1;
for(int i = 0; i < board.length; i++){
int cur = board[i][col];
if(cur != 0) {
if(!(stack.isEmpty()) && stack.peek()==cur){
answer+=2;
stack.pop();
}
else{
stack.push(cur);
}
board[i][col] = 0;
break;
}
}
}
return answer;
}
}