본문 바로가기

알고리즘/프로그래머스

[프로그래머스] kakao 2019 겨울 인턴십 크레인 인형뽑기 게임 [JAVA]

문제링크 : 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

명령어대로 인형을 뽑아서 어떤 공간에 차곡차곡 쌓다가 연속으로 2번 같은 인형이 겹치면 점수를 획득하는 게임이다.

 

위 한줄을 읽으니 당연 스택으로 구현하면 편해보인다. 그렇게 생각하니 인형이 있는  N*N 공간도 스택으로 구현하는 방법이 생각나서 그렇게 했다. 맵의 최대 열이 30이므로 한 열마다 스택 하나씩 해서 30개를 만들면 될 것 같다.

 

맵을 구성 후에는 명렁어대로 moves[i]열의 스택에서 인형을 꺼내서 인형을 쌓을 스택(ans)로 옮기고 원래 맨 위에 있던 인형과 같은 인형이면 점수를 획득과 동시에 두 인형은 제외하는 작업을 반복한다.

import java.util.*;
class Solution {
    public static int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack<Integer> st[]  = new Stack[31];
        Stack<Integer> ans = new Stack<Integer>();
        for(int i=1;i<31;i++){
        	st[i] = new Stack<Integer>();
        }
        for(int j=0;j<board[0].length;j++){
        	for(int i=board.length-1;i>=0;i--){
        		if(board[i][j]!=0){
        			st[j+1].push(board[i][j]);
        		}
        	}
        }
        
        for(int i=0;i<moves.length;i++){
        	int num = moves[i];
        	if(!st[num].isEmpty()){
        		int doll = st[num].pop();
        		if(!ans.isEmpty() && ans.peek() == doll){
        			answer+=2;
        			ans.pop();
        		}else{
        			ans.push(doll);
        		}
        	}
        }
        
        return answer;
    }
}