2 min read

<프로그래머스> 크레인 인형뽑기

문제링크

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

문제 분석

  • 주어지는 2차원 배열(board)은 아래의 그림처럼 인형뽑기 판을 나타낸다.
  • moves배열의 경우, 집게가 아래의 숫자 중 어디로 갈지 결정하는 배열인데, 해당 배열은 시작 index를 1로 잡았기에 구현시 move - 1의 값을 board에 넣어서 구현해야한다.
  • 접근할 열을 지정후(move-1이 board에서 접근해야 할 열의 인덱스를 나타냄), 해당 열을 내려가면서 0이 아닌값을 만나면 해당값을 스택에 푸쉬한다.
  • 이후 스택에 연속적으로 같은 값이 생기면 double pop을 해서 연속되는 값  두개를 없애고, 카운팅을 1 증가시킨다.
  • 최종적으로 카운팅 된 숫자가 정답이 된다.

구현 코드

import java.util.Stack;

public class CrainGame {
    public static int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack<Integer> res_stack = new Stack<>();//결과를 반영할 스택, 인형을 뽑은 후 인형을 쌓는 스택이라고 이해하기 
        int peek_value = -1;
        int count = 0;
        int row = 0;
        int col = 0;
        /*
            move를 증가 시켜가면서 몇번째 열로 접근 할지를 결정한다.
            Line 18 : 만약 보드의 숫자가 0이 아니라면, 즉 숫자가 들어가 있다 == 인형이 존재하면,
            res_stack에 해당 값을 푸쉬하고 해당 스택을 peek()해서 연속으로 같은수가 두번 들어가는 체크한다.
        */
        for (int move : moves) {
            for (int j = 0; j < board.length; j++) {
                if(board[j][move - 1] != 0){
                    res_stack.push(board[j][move - 1]);
                    if (peek_value == res_stack.peek()) {
                        doublePop(res_stack);
                        count++;
                    }
                    if(res_stack.size() == 0){
                        peek_value = -1;
                    }else{
                        peek_value = res_stack.peek();
                    }
                    row = j;
                    col = move - 1;
                    break;
                }
            }
            board[row][col] = 0; //인형을 꺼낸 인덱스의 값을 0으로 설정
        }
        answer = 2 * count;
        return answer;
    }

    public static void doublePop(Stack<Integer> stack){
        stack.pop();
        stack.pop();
    }

    public static void main(String[] args) {
        System.out.println(solution(new int [][]{{0,0,1,0,0},{0,0,1,0,0},{0,2,1,0,0},{0,2,1,0,0},{0,2,1,0,0}},new int [] {1,2,3,3,2,3,1}));

    }
}