[JAVA] 프로그래머스 : 크레인 인형뽑기 게임

조예빈·2024년 7월 20일
0

Coding Test

목록 보기
65/138

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;
    }
}

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글