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

: ) YOUNG·2021년 11월 14일
2

알고리즘

목록 보기
21/370
post-thumbnail

문제

https://programmers.co.kr/learn/courses/30/lessons/64061?language=java

크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.


제한조건

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

코드

import java.util.ArrayList;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        ArrayList<Integer> basket = new ArrayList<Integer>();

        for(int i=0; i<moves.length; i++) {
             int move = moves[i] - 1;

            int j = 0;
            // board의 열을 검사해서 0일경우 계속 반복해서
            // 0이 아닌 값을 찾음
            while(board[j][move] == 0) { 
                // 만약 board열 전체를 다 돌았는데 모두 0일경우 그대로 반복문을 중단함
                if(j >= board.length - 1) {
                    break;
                }
                else {
                    j++;
                }
            }

            //열의 마지막 값이 0일 경우 그냥 넘어감
            if(board[j][move] == 0) {
                continue;
            }
            else {
                // 뽑기에서 숫자가 빠져나간 자리는 다시 0으로 채워줌
                int temp = board[j][move];
                board[j][move] = 0;
                basket.add(temp);
            }
           
            // 바구니의 사이즈가 2이상일 경우 검사함
            if(basket.size() >= 2) {
                //바구니의 2번째부터 검사를 시작함
                for(int k=1; k<basket.size(); k++) {
                    // basket을 가장 앞부터 반복해서 검사한다.
                    // 만약 k번째에 있는 값과 k-1번째의 값이 똑같으면 remove를 실행한다.
                    if(basket.get(k) == basket.get(k - 1)) {
                        basket.remove(k);
                        basket.remove(k - 1);

                        // answer을 증가시킨후 계속 진행
                        answer += 2;
                        continue;
                    }
                }
            }
        }
        return answer;
}

0개의 댓글