[Programmers] 크레인 인형뽑기 게임

lkdcode·2023년 10월 20일

Algorithm

목록 보기
47/47
post-thumbnail

크레인 인형뽑기 게임


문제 분석

자세한 내용은 링크를 참고.

2차원 배열이 주어지고 인형들이 있다.

인형을 크레인으로 집어서 우측 바구니에 담는다.
바구니에 담을 때 같은 인형이 2개가 된다면 팡 터져서 삭제된다.

우측 바구니에 담긴 네오 인형이 2개이므로 삭제된다.
이런 규칙으로 삭제되는 인형이 몇 개인지 리턴하라.
(인형을 담은 2차원 배열, 크레인 작동 위치의 배열이 주어진다.)


풀이 과정

🎯 2차원 배열을 인형 뽑기 모양으로 보자

for (int[] line : board) {
	System.out.println(Arrays.toString(line));
}

주어진 배열을 한눈에 확인할 수 있다.
예제를 기준으로 출력을 해보면 아래와 같다.

출력 예시)

🏗️ 크레인은 여기서 집어간다. (위에서 아래로)

[0, 0, 0, 0, 0]
[0, 0, 1, 0, 3]
[0, 2, 5, 0, 1]
[4, 2, 4, 4, 2]
[3, 5, 1, 3, 1]
---------------

좌측부터 차례대로,

1번 라인으로 크레인이 움직이면 4번 인형을 집는다.
2번 라인으로 크레인이 움직이면 2번 인형을 집는다.
3번 라인은 1번 인형,
4번 라인은 4번 인형,
5번 라인은 3번 인형을 집는다.

각 번호는 인형들을 뜻하고 같은 인형은 번호가 같다.
크레인은 위에서 아래로 내려오면서 인형을 집는다. (각 라인의 맨 위 인형)
라인이 비어있다면 아무 일도 일어나지 않는다.
집은 인형은 우측 바구니에 담게 된다.


🎯 우측 바구니는 스택으로 구현해보자.

스택 : 선입후출의 선형 자료 구조

기존에 있는 인형과 새로 집어온 인형이 같은지 아닌지 비교해야한다.
스택은 해당 로직을 쉽게 구현한다.

<Stack<Integer> stack = new Stack<>();
// 우측 바구니
	[  ]
	[  ]
	[  ]
	[  ]
	[  ]
	----

크레인이 집어온 인형을 스택에 추가하자.

추가할 때의 로직은 간단하다,
1. 바구니가 비어있다면 인형을 추가한다.
2. 바구니가 비어있지 않다면 맨 위 인형을 .peek() 해서 꺼내온다.
2-1. 추가할 인형과 기존의 인형이 같다면 팡 터트려준다.
2-2. 같지 않다면 인형을 스택에 .push() 해준다.

2-1. 팡 터트려줄 때 카운트를 세준다.

                if (stack.size() == 0 || stack.peek() != doll) {
                    stack.push(doll);
                    break;
                } // 1
                
                if (stack.peek() == doll) {
                    stack.pop();
                    answer += 2;
                    break;
                } // 2

1-1. 스택이 비어있다면 인형을 추가한다.
1-2. 스택이 비어있지않고 꺼낸 인형이 집어온 인형과 다르다면 인형을 추가한다.
2. 스택에서 꺼낸 인형과 집어온 인형이 같다면 팡 터트려주고 카운트 해준다. 이때, 터진 인형은 2개다.



나의 생각

스택의 특성을 이용하여 쉽게 풀 수 있었다.
이 문제의 핵심음 2차원 배열을 어느 방향에서 바라보느냐와
자료 구조를 이용해서 핵심 로직을 푸는 것이다.


코드

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack<Integer> stack = new Stack<>();
        
        for (int move : moves) {
            int index = move - 1;
            
            for (int i = 0; i < board.length; i++) {
                if (board[i][index] == 0) continue;
                
                int doll = board[i][index];
                board[i][index] = 0;
                
                if (stack.size() == 0 || stack.peek() != doll) {
                    stack.push(doll);
                    break;
                }
                
                if (stack.peek() == doll) {
                    stack.pop();
                    answer += 2;
                    break;
                }
                    
            }
        }
        
        return answer;
    }
}

profile
되면 한다

0개의 댓글