programmers64061


クレーン式油抜きゲーム


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

問題の説明


ゲーム開発者のジョルディはクレーン型の抽出機をモバイルゲームに変えようとした.
ゲームの面白さを高めるために、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

    I/O例説明


    人形の初期状態は、与えられた問題の例と同じである.クレーンは[1,5,3,5,1,2,1,4]号の位置から順に人形を持ち上げ、かごに入れたが、状態は下図のようにかごの中で爆発して消えた人形が4個あった.
    //격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.  
    //filo
    //크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 
    //board의 숫자는 각각 다른 인형을 의미 같은숫자는 같은 인형
    //moves의 숫자 12345는 board의 [0][n]~[4][n]을 가르킨다.
    /*
        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
        이 때 moves가 [1,5,3,5,1,2,1,4]이라면 바구니에 인형이 쌓이는 순서는 다음과 같다.
        [4 3 1 1 3 2 4]
        11이 연속되어 사라지고, 33이 연속되어 사라진다.
        터트려서 사라진 인형의 개수는 4개가 된다.
        board[j][i]
    */
    
    function solution(board, moves) {
        var answer = 0;
        var basket = []//끌어올린 인형이 담기는 곳
    
        moves.map((el, idx) => {
            for (let i = 0; i < board.length; i++) {//행
              //0행 el-1열, 1행 el-1열, 2행 el-1열 ...
              //행은 변경, 열은 고정
              if (board[i][el - 1] !== 0) {
                    basket.push(board[i][el - 1])
                  
    		//basket 배열의 끝에 2개의 인형 확인 후 제거
                    if (basket[basket.length - 1] === basket[basket.length - 2]) {          
                        answer += 2
                        basket.splice(basket.length - 2, 2)
                    }
                    board[i][el - 1] = 0
                    break
                }
            }
        })
        return answer;
    }