본문 바로가기
알고리즘/문제풀이

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

by 겅아링 2020. 12. 2.
반응형

 

풀이 > 

주어지는 보드판에 0이 아닌 맨 위 블럭을 가져와야 되기 때문에
보드판 세로 한줄씩을 Stack으로 구현 했다(표현이 쉽도록 ArrayList로 구현)
세로줄 스택에서 맨위 요소를 꺼내 뽑은 인형이 저장되어있는 result스택에 
맨 위 요소와 같은지 확인 후 삭제(answer+=2) 하거나 인형을 저장했다
import java.util.ArrayList;
import java.util.Stack;

public class ProgrammersKakaoCrane {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;

        ArrayList<Stack<Integer>> stackList = new ArrayList<>();
        Stack<Integer> result = new Stack<>();
        //맨 위 요소와 비교해야하기 때문에 0으로 값을 하나 넣어줌 
        result.push(0);
        for (int i = 0; i < board.length; i++) {
            stackList.add(new Stack<>());
            for (int j = board.length - 1; j >= 0; j--)
            //0이 아니면서 세로줄의 맨 아래 요소부터 push
                if (board[j][i] != 0)
                    stackList.get(i).push(board[j][i]);
        }

// 보드판이 제대로 구현됐는지 확인
// stackList.forEach(System.out::println);

        for (int i : moves) {
        	// moves의 해당 세로줄이 비어있지 않다면
            if (!stackList.get(i - 1).isEmpty()) {
            	//뽑은 인형을 저장하는 스택에 맨 위 요소와 
                //현재 뽑은인형을 비교해 같으면 삭제후 answer에 2증가
                if (result.peek().equals(stackList.get(i - 1).peek())) {
                    stackList.get(i - 1).pop();
                    result.pop();
                    answer += 2;
                // 맨 위 요소와 현재 뽑은 인형이 같지않다면 뽑은 인형을 저장
                } else
                    result.add(stackList.get(i - 1).pop());
            }
        }

//        result.forEach(System.out::println);
//        System.out.println(answer);
        return answer;
    }
}
반응형