[プログラマー]クレーン兄抽出ゲーム(Java)


📍 質問する


ゲーム開発者のジョルディはクレーン型の抽出機をモバイルゲームに変えようとした.
ゲームの面白さを高めるために、Jordieは画面レイアウトとルールをゲームロジックに反映し、以下のようにします.

ゲーム画面はN x Nサイズの正方形メッシュで、1 x 1サイズのセルからなり、上はクレーンで、右はバスケットです.(上図は5 x 5サイズの例を示しています).各格子間には様々なぬいぐるみがあり、ぬいぐるみのない格子は空いています.すべての人形が1 x 1サイズのメッシュを占め、メッシュの一番下から順番に積み上げられます.ゲームユーザーはクレーンを左右に動かし、停止した位置から一番上の人形を持ち上げることができる.拾った人形はかごの中に積み上げられ、かごの一番下の格子から人形は順番にかごの中に積み上げられます.下図(省略)は、[1番、5番、3番の位置から順に人形を持ち上げてかごに入れる様子を示しています.
同じ形の2人の人形が連続してかごに積まれると、2人の人形が爆発してかごから消えてしまいます.上の状態で、次に[5番]の位置で人形をかごに積み上げると、同じ形の人形が2つ消えてしまいます.

クレーンが作動すると、人形が挟まないことはありませんが、人形がないところでクレーンを起動すれば、何も起こりません.また、バスケットが十分大きく、すべての人形を収容できると仮定します.(図中、スクリーン表示制限は5コマのみ表示)
ゲーム画面上の格子状態の2次元配列板と人形を挟むために、起動クレーンの位置を含む配列動作をパラメータとして指定した場合、solution関数を完了し、クレーンをすべて起動させ、爆発して消えた人形の個数を返します.

💡 に近づく


右側に抜いた人形がスタックのように積み上げられているのでスタックを使います.

👩‍💻 コード#コード#

import java.util.*;
class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        
        Stack<Integer> stack = new Stack<>();
        
        // 맨 위 값과 비교할 때 오류가 안나게 하기위해 0을 넣어준다.
        stack.push(0);
        
        for(int move : moves) {
            for(int j=0; j<board.length; j++) {
                if(board[j][move - 1] != 0) {
                    
                    if(stack.peek() == board[j][move-1]) {
                        stack.pop();
                        answer += 2;
                    } else {
                        stack.push(board[j][move-1]);
                    }
                    
                    board[j][move-1] = 0;
                    break;
                }
            }
        }

        return answer;
    }
}

🔗 リンク


https://programmers.co.kr/learn/courses/30/lessons/64061