Programmers [크레인 인형 뽑기 게임] - 64061

2022. 1. 25. 20:25프로그래머스

문제는 다음 링크를 참고해주세요.

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[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

programmers.co.kr

 

인형 뽑기 게임입니다.

개인적로는 문제 설명이 좀 부족해서 아쉬웠던... 문제였습니다.

board 2차원 배열의 예시 부분에서 이해하기 힘든 분들이 많았을 거라고 생각이 듭니다. 

 

중요한 자료구조의 하나인 스택을 사용하는 문제였습니다.

Stack<Integer> stack = new Stack<>();

java.util.stack 

자바에서 스택 클래스를 구현해 놓았으니 가져다 쓰면 되겠습니다.

 

moves[] 를 매개변수로 받는데 몇 번째 레인에서 인형뽑기를 할 것인지 를 알 수 있습니다.


저는 int idxOfLane[] 배열에 각 레인에 인형이 얼마나 남았는지를 표시했습니다.

 

idxOfLane[N] = M;  => N+1 번 레인에 M+1개의 인형이 남아있다.

idxOfLane[1] = 3; 이라면 1번 레인에는 4개의 인형이 남아있다는 의미입니다.

 

기계기 인형을 뽑아가면 idxOfLane 값이 1만큼 감소합니다.

 

이 뽑아온 값을 Stack에 있는 값과 비교하여 동일하면 pop을, 아니라면 push 해주면 되겠습니다.

Stack을 활용한 문제로, stack 활용법을 알고 있다면 어렵지 않은 문제였습니다.

 

 

전체 소스코드

public int solution(int[][] board, int[] moves) {
    int result = 0;
    Stack<Integer> stack = new Stack<>();
    int n = board.length;
    int[] idxOfLane = new int[n];
    for(int i=0;i<n;i++){
        idxOfLane[i] = n-1;
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<=n-1;j++){
            if(board[j][i] == 0){
                idxOfLane[i]--;
            }else break;
        }
    }

    for (int num : moves) {
        int idx = idxOfLane[num-1];
        int xIndex = (n-1)-idx;
        int yIndex = num - 1;
        int number = board[xIndex][yIndex];
        if(number != 0){
            board[xIndex][yIndex] = 0;
            if(idxOfLane[num-1]!=0)
                idxOfLane[num-1]--;
            if(!stack.isEmpty() && number == stack.peek()){
                stack.push(number);
                stack.pop(); stack.pop();
                result += 2;
            }else
                stack.push(number);
        }else{ // 뽑기 했는데 빈 경우

        }
    }
    return result;
}