문제의 내용이 너무 길고 복잡한 관계로 링크로 대체하겠다.
import java.util.ArrayList;
import java.util.Stack;
public class KakaoCrain {
public static void main(String[] args) {
KakaoCrain k = new KakaoCrain();
int[][] board = {{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}};
int[] moves = {1,5,3,5,1,2,1,4};
int solution = k.solution(board, moves);
System.out.println("solution = " + solution);
}
public int solution(int[][] board, int[] moves) {
int answer = 0;
ArrayList<Stack> stackList = new ArrayList<>();
Stack<Integer> basket = new Stack<>();
int boardLeng = board[0].length;
int w = 0;
//배열의 길이만큼 stack을 만들어서 리스트에 담고
while(w++<boardLeng){
stackList.add(new Stack());
}
//배열에서 값을 가져와 stack에 맞게 넣어준다.
for(int i = boardLeng-1; i>=0; i--){
int[] b = board[i];
for(int j=0; j<b.length; j++){
int input = b[j];
if(input==0){
continue;
}else{
stackList.get(j).push(input);
}
}
}
//크레인이 뽑기 하는 과정 구현
//뽑은 후 바구니에 들어가야함.
for(int m : moves){
//차례대로 뽑기
int idx = m-1;
Stack<Integer> stack = stackList.get(idx);
//스택이 비어 있지 않다면 push
if(!stack.isEmpty()){
//push하기 전에 basket이 비어있는지 확인 후 비어있지 않다면 확인
int pop = stack.pop();
if(basket.isEmpty()){
basket.push(pop);
}else{
if(basket.peek() == pop){
basket.pop();
answer+=2;
}else{
basket.push(pop);
}
}
}
}
return answer;
}
}
1단계 문제라 쉬운편이지만 Stack의 개념을 아주 잘 이해할 수 있는 문제였다. 처음에는 List로 Stack을 담아둘 생각을 하지 못해서 무식하게 Swtich로 분리해서 담고 빼고 했다... 그러다보니 코드가 무식해지고 나중에 문제를 틀려서 고치려고 보니까 손을 못대겠더라... 그래서 아예 싹 지워버리고 새로 풀었더니 생각보다 쉽게 풀렸다.
Stack의 pop, peek, push만 알아도 풀수 있는 문제니 잘 생각해보고 풀면 누구든 금방 풀수 있다!
같은 값을 여러개 주어지게 된다면 List부터 떠올려보자!