모바일 개발하는 자바리안의 메모장

자바(JAVA) - 크레인 인형뽑기 게임(Programmers : 64061) 본문

Java/Java.algorithm

자바(JAVA) - 크레인 인형뽑기 게임(Programmers : 64061)

자바리안 2021. 6. 10. 15:57
반응형

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

인형뽑기에서 뽑은 인형들을 바구니에 담았을 때, 마지막 담았던 인형이 방금 집어 넣은 인형과 같을 경우 터지게 되며,
터진 인형의 개수를 return하는 아주 간단한 문제. LIFO 자료구조, Stack을 이용하면 쉽게 풀 수 있다.
라고 생각하고 Submit 했지만, 몇몇 상황에 대한 예외처리가 필요했다.

 

실행 순서는 다음과 같다 :

    1. 크레인을 내릴 위치가 담긴 moves 배열의 값을 Column값으로, 가장 위에 위치한 인형 확인

    2. 인형이 위치했던 자리의 배열값 0으로 수정 & 아래 조건 확인

      * Stack이 empty일 경우 무조건 Push > Empty 상태에서 Peek() 시 발생하는 EmptyStackException에 대한 예외처리

      * Stack의 맨 마지막 값과 방금 꺼낸 인형이 같을 경우

        > Return 값 2씩 증가 인형을 터뜨린 뒤에 연속되는 인형들에 대한 처리를 위해 While문에 위치해야 함

      * 위 2개 조건 외에는 그냥 Stack에 인형 push

 

<코드>

import java.util.*;
class Solution {
    public int solution(int[][] board, int[] moves) {
        int N = board.length;
        int answer = 0;
        
        Stack<Integer> basket = new Stack<Integer>();
        
        for(int n : moves) {
            for(int i = 0; i < N; i++) {
                int top = board[i][n-1];

                // 맨 위에 위치한 인형 확인됐을 경우 
                if(top != 0) {
                    // 꺼낸 인형 자리 0 표시
                    board[i][n-1] = 0;
                    
                    // Basket이 0

                    if(basket.peek() == top) {
                    	while(!basket.isEmpty() && basket.peek() == top) {
                    		answer += 2;
                        	top = basket.pop();           
                    	}
                    } else {
                        basket.push(top);
                    }
                    break;
                }
            }            
        }
        return answer;
    }
}
반응형
Comments