https://school.programmers.co.kr/learn/courses/30/lessons/64061
문제 자체는 어렵지 않았다. 인형뽑기의 그림에서 나온 대로, 각 열에 대한 stack을 만들어 주면 되는 문제이다.
다만, 이중 for문을 돌려 각 배열을 순회하고 스택에 넣어 줄 때 순서를 고려해야 한다. 그냥 i,j값을 증가시키도록 넣으면 스택에 거꾸로 들어간다. 그러므로 i값을 감소시키면서 바닥부터 넣어 주어야 한다. (바닥부터 넣어야 먼저 들어간 것이 나중에 나옴)
또한, 나는 각 스택을 구현할 때 스택을 저장할 배열에다가 각 스택을 넣어 주었다.
0번째 방에는 [][0]만, 1번째 방에는 [][1]만 들어가면 되므로 각 배열의 j번째 방의 선언해 둔 스택에 각 요소를 넣으면 된다.
(stackArr[j]에 board[i][j]를 넣으면 됨)
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
//각 열의 값들을 스택에 저장해야 함
//스택을 저장할 배열 선언
Stack<Integer>[] stackArr = new Stack[board[0].length];
Stack<Integer> stack = new Stack<>(); //바구니
int answer = 0;
for(int i=0; i<stackArr.length; i++){
stackArr[i] = new Stack<>(); //각 방마다 스택 생성
}
for(int i=board.length-1; i>=0; i--){ //역순으로(아래에서부터 위로) 스택에 저장해야 함
for(int j=0; j<board[i].length; j++){
if(board[i][j] != 0){ //0이 아니면 스택에 추가
stackArr[j].push(board[i][j]);
}
}
}
for(int i=0;i<moves.length;i++){
int stackArrNum = moves[i] -1; //어느 열인지
if(!stack.isEmpty() && !stackArr[stackArrNum].isEmpty()){ //바구니와 각 열의 스택이 비어 있지 않으면
int rowTop = stackArr[stackArrNum].peek(); //각 열의 스택의 최상단 요소
int basketTop = stack.peek(); //바구니의 최상단 요소
if(rowTop == basketTop){ //각 열의 스택의 최상단 요소와 바구니의 최상단 요소가 같으면
stackArr[stackArrNum].pop(); //각 열 스택에서 꺼냄
stack.pop(); //바구니에서 꺼냄
answer = answer + 2; //cnt 값 2 증가
}else{ //같지 않으면 각 열 스택에서 꺼내고 그냥 바구니에 추가
stack.push(stackArr[stackArrNum].pop());
}
}else if(!stackArr[stackArrNum].isEmpty()){ //바구니가 비어 있으면
stack.push(stackArr[stackArrNum].pop());
}
}
return answer;
}
}