크레인 인형뽑기 (JAVA)

HwiJeongLee·2021년 5월 25일
2

프로그래머스

목록 보기
3/6

문제 설명

게임 화면은 "1x1" 크기의 칸들로 이루어진 "NxN"크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. 각 격자 칸에는 다양한 인형들이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.
게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올리고 그 인형은 바구니에 쌓이게 됩니다. 이 때 인형은 바구니의 가장 아래칸부터 순서대로 쌓이게 됩니다.

만약 같은 모양의 인형이 연속해서 쌓이게 되면 두 인형은 바구니에서 사라지게 됩니다. 만약 해당 칸에 인형이 없다면 아무런 일도 일어나지 않습니다. 바구니의 크기는 충분히 크다고 가정합니다.

게임 화면의 격자의 상태가 담긴 board 2차원 배열과 작동 시킬 위치가 담긴 moves 배열이 주어질 때, 크레인을 모두 작동시킨 후 사라진 인형의 개수를 return하는 함수를 구현하시오.

제한 사항

  1. board 2차원 배열의 크기는 5x5 이상 30x40 이하이다.
  2. 배열의 원소 값이 0이라면 비어있는 공간이다.
  3. 원소의 값이 같다는 것은 같은 인형임을 의미한다.

풀이

이 문제를 보고 스택을 사용해야겠다는 생각을 바로 할 수 있었습니다.
바구니의 크기는 moves배열의 크기로 설정하였습니다.
그리고 moves 배열 값에서 -1을 해야 실제 배열의 위치가 됩니다.

저는 초반에 배열의 값이 0인 순간을 집중적으로 보았습니다.

우선 해당 배열에 값이 있다면 그 값을 꺼내서 바구니에 넣습니다.
그 후 바구니 속 현재 값과 그 전의 값이 같다면 같은 인형이므로 두개를 pop 해줍니다.

이 때 저는 top이라는 변수를 다음 인형이 들어올 곳으로 지정해 두었는데 push를 하면 top + 1, pop을 하면 top-2 를 해주어 인형을 넣고 뺐습니다.
또 pop을 함과 동시에 answer+2를 해주면서 사라진 인형의 갯수도 기록하였습니다.

실제 코드 및 결과

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

        int answer = 0;

        int []store = new int[moves.length];
        int top = 0;

        int j;

        for(int i = 0; i<moves.length;i++){
            j=0;
            while(board[j][moves[i]-1] == 0){
                j++;
                if(j==board.length){
                    break;
                }

            }
            if(j==board.length){
                continue;
            }
            int num = board[j][moves[i]-1];

            board[j][moves[i]-1]=0;
            push(store,top,num);
            top++;

            if((top!=0) && (top!=1) && store[top-1]==store[top-2]){
                top = top-2;
                answer = answer + 2;
            }
        }

        return answer;
    }
    private void push(int []store, int top, int num){
        store[top++] = num;
    }


    //테스트를 위한 main 함수 구현
    public static void main(String[] args) {
        doll solution = new doll();
        int[][] board = new int[][] {
                new int[]{0,0,0,0,0},
                new int[]{0,0,1,0,3},
                new int[]{0,2,5,0,1},
                new int[]{4,2,4,4,2},
                new int[]{3,5,1,3,1}
        };
        int[] moves = new int[] {1,5,3,5,1,2,1,4};
        int answer = solution.solution(board, moves);
        System.out.println(answer);
    }
}

다음번에는 util에서 제공하는 Stack 클래스를 이용해서 더 간단하게 코드를 구현해 볼 예정입니다.

profile
초보 개발자의 개발 공간

0개의 댓글

관련 채용 정보