[テストコード]抽出クレーン型

11974 ワード

クレーン抜き型


質問する


質問元:テストコード

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

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

クレーンが作動すると、人形が挟まないことはありませんが、人形がないところでクレーンを起動すれば、何も起こりません.また、バスケットが十分大きく、すべての人形を収容できると仮定します.(図中、スクリーン表示制限は5コマのみ表示)
ゲーム画面上の格子状態の2次元配列板と人形を挟むために、起動クレーンの位置を含む配列動作をパラメータとして指定した場合、solution関数を完了し、クレーンをすべて起動させ、爆発して消えた人形の個数を返します.
[制限]
  • マザーボードアレイは2 Dアレイで、サイズは「5 x 5」または「30 x 30」より大きい.
  • boardの各セルには、0または100以下の整数が含まれています.
    -0はスペースです.
    -1から100の各数字は異なる人形の形を表し、同じ数字は同じ形の人形を表す.
  • モバイルアレイのサイズは1000を超えません.
  • movies配列の各要素の値は1より大きく、自然数であり、スラブ配列の水平寸法より小さい.
    I/O例
    board
    moves
    result
    [[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
    人形の初期状態は、与えられた問題の例と同じである.クレーンは[1,5,3,5,1,2,1,4]号の位置から順に人形を持ち上げ、かごに入れたが、状態は下図のようにかごの中で爆発して消えた人形が4個あった.

    質問元:テストコード

    問題を解く


    以下の傾向で問題解決の提案を行った.
    1.movesの値はboardのindex値を指します.
    2.0はスキップし、数字があるときは別のボウルに入れます.
    3.同じ数字が2回表示された場合、その数字は削除され、ポイント数が累積されます.
    作成されたコードは次のとおりです.
    //문제에서 주어진 board와 moves 
    let board = [
        [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]
    ]	
    let moves = [1,5,3,5,1,2,1,4]	
    
    function solution(board, moves) {
        let answer = []; //그릇으로 전환
        let cnt = 0;
        let point = 0;
        //먼저 moves만큼 for구문을 반복시켜서 board index의 위치를 정하자 
        for (let i = 0; i < moves.length; i++) {
            //다음 board만큼 반복 시켜서 moves의 위치에서 5개의 배열을 전부 검사한자
            for (let j = 0; j < board.length; j++) {
            //0이 아닌 수를 다른 곳에 담자. answer를 배열로 바꾸면 되겠다.
                if(board[j][moves[i]-1] !== 0 && cnt === i){
                    //이렇게 담으면 0이 아닐 때 board[j]의 값이 추가로 담긴다. 값이 담기고 바로 다음 순서로 넘어가도록  cnt를 만들어서 막아주자
                    cnt ++; //다음 moves로 넘어간다. 
                    //answer += board[j][moves[i]-1]; // 아래 조건문과 중복됨으로 삭제
                    //값을 단순히 축척시키는 것이 아닌 배열로 만들어야 한다. 
                    //담긴 배열이 중복 수 가 나오면 point를 올리고 안나오면 담아내는 조건문을 만들자.
                    if(answer[answer.length-1] === board[j][moves[i]-1]){
                        //point 변수를 추가하여 값을 담자
                        answer.pop(); // 중복될 때 숫자 제거. 
                        point += 2;
                        
                    }else{
                        answer.push(board[j][moves[i]-1])
                    }
                    // 위 조건을 거치고 숫자가 빠질때 0이 채워져야 한다.
                    board[j][moves[i]-1] = 0;       
                }            
            }
            
        }
      // answer가 아닌 point를 return 시켜야지 원하는 result를 출력한다.
        return point;
    }
    solution(board,moves)

    解決後


    上記のように考えたが,コードの作成には多くの困難があった.
    特に解決していない部分.
    1.重複コードを見つけて重複を防ぐ方法
    2.答えに値が含まれている場合、配列形式ではなく文字列として出力するため、値を正しく出力できません.
    3.値を取り出し、値をポップアップし、board配列に0を入れず、再び値を読み込む点を繰り返す
    以上の3点は解決していませんが、他の人のコードを参考にして解決します.
    まだ自分で解決する能力がないようで、同じコードを3~4回自分で書きました.
    上記の類似の問題に加えて,類似のアルゴリズムを必要とする多くの問題がある.
    あきらめないで