알고리즘/JAVA

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

야아옹 2021. 2. 28. 19:46

설명 : 게임 화면은 "1 x 1" 크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다.

 

규칙 1. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.

규칙 2. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다.

규칙 3. 만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다.

 

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

 

 

풀이 :  처음에 규칙에대해서 이해를 하지 않고 대충 그림만 보고 파악하여 원하는 결과 값이 안나와 시간이 걸렸다..

1. board 인자값을 이용하여 맵(인형 쌓기) 를 만든다고 가정 시 세로를 하나의 클래스로 Queue 를 사용하여 저장이를 Line.Class 로 놓으며 이에는 Queue 를 이용한 Add, Draw 메소드로 구성한다.

2. 세로줄의 Class 들이 만들어졌을 시 Moves 값을 넣어 (세로 클래스의 Index) 한개씩 값을 가져오는 ScoreResult.Class를 만들고 이에 calcResult 메소드를 실행

3. 인형을 이동시킨후 쌓인 List 에대하여 규칙3을 따라 지울 시 재귀를 하여 처음부터 다시 확인

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class Solution {
    public class Line
   {
      private int index;
      private Queue<Integer> q;
      public Line(int index) {
         this.index = index;
         q = new LinkedList<>();
      }
      public void add(int number)
      {
         if(number == 0) return;
         q.add(number);
      }
      public int Draw(int lineNumber)
      {
         if(q.size() == 0) return 0;
         return q.poll();
         
      }
   }

public class ScoreResult
   {
      private List<Integer> list;
      private int score;
      private boolean restartFlag = true;
      public ScoreResult(List<Integer> qlist) {
         this.list = qlist;
      }
      private void calcScore()
      {
         for(int i = 0; i < list.size(); i++)
         {
            if(i >= list.size() - 1) return;
            int current = list.get(i);
            if(current == list.get(i+1))
            {
               list.remove(i);
               list.remove(i);
               score+=2;
               calcScore();
            }
         }
         
      }
   }
    public int solution(int[][] board, int[] moves) {
       int answer = 0;
            List<Line> lineList = new ArrayList<>();
            for(int i =0; i < board.length; i++)
                lineList.add(new Line(i));

            for(Line line : lineList)
            {
                for(int j =0; j < board.length; j++)
                    line.add(board[j][line.index]);
            }
            List<Integer> drawDoll = new  ArrayList<>();

            for(int k = 0; k < moves.length; k++)
            {
                for(Line line : lineList)
                {
                    if(line.index == moves[k] - 1)
                    {
                    int drawNumber = line.Draw(k);
                    if(drawNumber != 0)
                    {
                         drawDoll.add(drawNumber);
                    }
                    }
                }
            }
            ScoreResult sr = new ScoreResult(drawDoll);
            sr.calcScore();
            answer = sr.score;
            return answer;
    }
}