알고리즘(Algorithm)/프로그래머스(Programmers)

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

나아가는중 2021. 10. 23. 22:02
반응형

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


문제 설명

  1. 게임 화면은 N x N 크기의 정사각 격자이먀 위쪽에는 크레인이 있고 오른쪽에 바구니가 있다.
  2. 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸이다.
  3. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올려 바구니에 쌓는다.
  4. 바구니에 같은 모양의 인형 두 개가 연속해서 쌓이게 되면 사라진다.
  5. 터트려서 사라진 인형의 개수를 return.

제한 사항

  1. board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
  2. board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
    • 0은 빈 칸을 나타냅니다.
    • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  3. moves 배열의 크기는 1 이상 1,000 이하입니다.
  4. moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

문제 풀이

  1. 주어진 크레인 작동 위치를 순회, for문을 사용해 가장 위에 있는 인형을 찾는다.
  2. 가장 위의 인형이 바구니의 가장 위의 인형과 동일하면 바구니의 인형을 제거 개수를 2 증가.
    • 가장 위의 인형을 찾고, 제거하기 쉽게 stack을 사용.
  3. 바구니가 비어 있거나 바구니의 가장 위의 인형이 현재 크레인이 선택한 인형과 다를시 바구니에 추가.
  4. 1에서 찾은 인형이 제거되므로 0으로 변경. 인형을 찾았으므로 for문은 중지.

소스 코드

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        int N = board.length;

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

        for (int m : moves) { // 1
            for (int i = 0; i < N; i++) {
                if (board[i][m - 1] != 0) { // 2
                    if (!stack.isEmpty() && stack.peek() == board[i][m - 1]) {
                        stack.pop();
                        answer += 2;
                    } else { // 3
                        stack.push(board[i][m - 1]);
                    }

                    board[i][m - 1] = 0; // 4
                    break;
                }
            }
        }

        return answer;
    }
}
반응형