[programmers]クレーン兄抽出ゲーム-JAVA


📄 問題の説明


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

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

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

📑 せいげんじょうけん

  • boardアレイは2次元アレイであり、サイズは「5 x 5」または「30 x 30」より大きい.
  • boardの各セルには、0以上の整数が含まれています.
  • 0はスペースを表します.
  • 1~100の数字は1つの月人形の形を表し、同じ数字は同じ形の人形を表す.
  • moves配列のサイズは1または1000未満です.
  • moves配列の各要素の値は1より大きく、board配列の水平サイズよりも自然数である.
  • 🔐 入出力例


    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.*;
    class Solution {
        public int solution(int[][] board, int[] moves) {
    	int answer = 0;
    	ArrayList<Integer> list = new ArrayList<>();  //바구니
    		 
    	for(int i = 0; i < moves.length; i++) { 
    	   for(int j = 0; j < board.length; j++) {
    	      if(board[j][moves[i]-1] != 0) { //배열 이기 때문에 -1을 한다
    	         list.add(board[j][moves[i]-1]); // 값이 0이 아니라면 LIST에 담아주고 
    	         board[j][moves[i]-1] = 0; // 그 자리의 값을 0으로 바꿔준다.
    	      
                  if(list.size() > 1) {         
    		if(list.get(list.size() - 1) == list.get(list.size() - 2)) {
            	   list.remove(list.size() - 1);
    		   list.remove(list.size() - 1);
    		   answer += 2;
    		 }
    		}
    		break;
    	        }
    	      }
    	    } 
    	     return answer;
        }
    }

    👨🏻‍🏫 コード解析


    この問題は絵を描くともっと問題を解きやすい.
  • if(board[j][moves[i]-1] != 0)j(行)は、ゼロ以外の値が現れるまでj++になります.
  • list.add(board[j][moves[i]-1])の値は0ではありません.つまり、4はバスケットに入ります.
  • board[j][moves[i]-1] = 0board[4][0]=0で、クレーンが再び現れたときの冗長性を解消できる.
  • if(list.size() > 1)かごの中に2つ以上の人形
  • if(list.get(list.size() - 1) == list.get(list.size() - 2))最初の人形と2番目の人形を比較します.
  • list.remove(list.size() - 1)