문제

게임개발자인 "죠르디"는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
"죠르디"는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.

게임 화면은 "1 x 1" 크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형 두 개가 없어집니다.


힌트

  • 게임의 관점에서 바라보면 원래는 뽑은 인형이 담겨있는 stack에 인형이 연속되는 순간 처리를 해야하지만 연속되는 순간 처리하나, 일괄적으로 처리하나 결과는 같습니다.
  • 인형이 쌓여있는 게임판의 세로 한 줄을 column이라고 할때 moves에서 가져온 위치의 0이 아닌 숫자를 가져와 list에 담습니다.
  • 해당 위치의 숫자는 배열에서 0으로 처리해줍니다.
  • list의 연속된 내용을 제거합니다.

풀이

import java.util.ArrayList;
import java.util.List;

class Solution {
    private int answer = 0;

    public int solution(int[][] board, int[] moves) {

        List<Integer> stack = getDolls(board, moves);
        removeDuplicates(stack);
        return answer;
    }

    boolean isDuplicated(List<Integer> stack) {
        boolean result = false;
        for(int i = 0; i < stack.size(); i++) {
            if(i < 1) continue;

            if(stack.get(i) == stack.get(i - 1)) {
                result = true;
            }
        }

        return result;
    }

    void removeDuplicates(List<Integer> stack) {
        for(int i = 0; i < stack.size(); i++) {
            if(i < 1) continue;

            if(stack.get(i) == stack.get(i - 1)) {
                answer += 2;
                stack.remove(i);
                stack.remove(i - 1);
            }
        }

        if(isDuplicated(stack)) removeDuplicates(stack);
        else return;
    }

    List<Integer> getDolls(int[][] board, int[] moves) {
        List<Integer> stackList = new ArrayList<Integer>();

        for(int line : moves) {
            int column = line - 1;

            for(int[] boardRow : board) {
                if(boardRow[column] != 0) {
                    stackList.add(boardRow[column]);
                    boardRow[column] = 0;
                    break;
                }
            }
        }
        return stackList;
    }
}
출처

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

0개의 댓글