[プログラマー]クレーン兄抽選ゲーム🧸


📌 問題の説明


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

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

同じ形の2人の人形が連続してかごに積まれると、2人の人形が爆発してかごから消えてしまいます.上の状態で、次に[5番]の位置で人形をかごに積み上げると、同じ形の人形が2つ消えてしまいます.

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

📢 制限状況

  • ボードアレイは2次元アレイであり、サイズは5 x 5または30 x 30以下である.
  • boardの各セルには、0または100以下の整数が含まれています.
    -0はスペースです.
    -1から100の各数字は異なる人形の形を表し、同じ数字は同じ形の人形を表す.
  • モバイルアレイのサイズは1000を超えません.
  • movies配列の各要素の値は1より大きく、自然数であり、スラブ配列の水平寸法より小さい.
  • 👉 I/O例


    boardmovesresult[[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,5,3,5,1,2,1,4]4

    💡 に答える

    import java.util.Stack;
    class Solution {
        public int solution(int[][] board, int[] moves) {
            Stack<Integer> stack = new Stack<>(); 
            int answer = 0;
            for(int i = 0; i<moves.length; i++){
                for(int j = 0; j < board[0].length; j++){
                    if(board[j][moves[i]-1] != 0){
                        int temp = board[j][moves[i]-1];
                        board[j][moves[i]-1] = 0;
                        
                        if(stack.empty() == false){
                            if(temp == stack.peek()){
                                stack.pop();
                                answer+=2;
                            }else{
                                stack.push(temp);
                            }
                            break;
                        }else{
                            stack.push(temp);
                            break;
                        }
                    }
                }
            }
            return answer;
        }
    
    }

    💻 アルゴリズム#アルゴリズム#


    👉 人形を捕まえる場所をスタックと宣言する.
    👉 movesの値をboardのカラムインデックスとして使用してboardの人形を抽出します.
    👉 スタックに人形がない場合は、抜いた人形をスタックに入れます.
    👉 スタックにぬいぐるみがある場合は、スタックの上部のぬいぐるみと選択したぬいぐるみが同じかどうかを比較します.
    👉 同じであれば、選択されたぬいぐるみをスタックに置くのではなく、スタックの上部のぬいぐるみをスタックから取り出します.
    👉 違う場合は、選択した人形をスタックに入れます.