[TIL] 211114


📝 今日作った

  • プログラマー解答-クレーン式抽出ゲーム
  • 📚 学識


    1.プログラマーの回答


    1)クレンジング式油抜きゲーム


    2019 KACA開発者冬季実習問題

    (1)私が考える論理


  • まずmoves配列の要素値が1の場合、board配列の最初の要素(サブ配列)の最初の要素(インデックス0)の値が0であるかどうかを確認します.

  • 0でない場合は、値を取り出してバスケット配列に押し込みます.
    このとき、bank配列のi要素がi-1の要素と同じ場合、2つの要素がポップアップされ、deleteNum変数の値が+2になります.
    次にmoves配列の次の要素の値を取得します.

  • 0の場合、board配列の2番目の要素(サブ配列)の1番目の要素(インデックス0)の値が0であるかどうかを確認します.
    0でないまで繰り返します.
    board配列の最後の要素の最初の要素(インデックス0)さえ0の場合、move配列の次の要素に値を入力します.

  • moves配列の最後の要素に繰り返します.
  • (2)私の回答

    const basket = [];
    moves.reverse();
    let cranePosition = moves.pop() - 1;
    let movesLength = moves.length;
    let deleteNum = 0;

  • 人形を入れた空きかごのバスケット配列とクレーンの移動位置を表すCranePosition変数,爆発人形の個数を表すdeleteNum変数を作成した.

  • クレーンを動かすたびにshift()を使うよりも、reverse()とpop()を初めて使うほうが効率的だと思います.
  • const dollNum = board[i][cranePosition];
    for (let i = 0; i < board.length; i++) {
      if (dollNum !== 0) {
       basket.push(dollNum);
       board[i][cranePosition] = 0;
      }
    }
  • ドル(人形番号)が0でない場合は、バスケット別に並べます(バスケット).このときこの人形はかごに移動され、元の位置から消えたので、その人形の位置の値を0に変更します.
  • if (basket.length > 1) {
      const last = basket.pop();
      const secondToLast = basket.pop();
      if (last === secondToLast) {
        deleteNum = deleteNum + 2;
      } else {
        basket.push(secondToLast);
        basket.push(last);
      }
    }
  • かごに2つ以上の人形が入っている場合は、一番上の人形と下の人形を比較します.二人が同じ人形であれば、直接爆発し、爆発した人形の数は+2です.二人が違う人形なら、最後に出したものをかごに戻します.
  • let cranePosition = moves.pop() - 1;
    let movesLength = moves.length;
    
    while (movesLength >= 0) {
      for (let i = 0; i < board.length; i++) {
        const dollNum = board[i][cranePosition];
        if (dollNum !== 0) {
          // 중략
          break;
        }
      }
      cranePosition = moves.pop() - 1;
      movesLength--;
    }

  • 人形番号が0でない場合は、その番号をかごの配列に入れ、breakを使用してクレーンをすぐに次の位置に移動させ、for反復ドアから脱出します.その後、クレーンの位置を変更し、whileの繰り返し文の条件が正しい場合に上記の操作を繰り返します.

  • moves.lengthが0未満の場合は、クレーンが停止していることを示します.そのため、whileの繰り返し文は避けてください.
  • (3)最終コード

    function solution(board, moves) {
      const basket = [];
      moves.reverse();
      let cranePosition = moves.pop() - 1;
      let movesLength = moves.length;
      let deleteNum = 0;
    
      while (movesLength >= 0) {
        for (let i = 0; i < board.length; i++) {
          const dollNum = board[i][cranePosition];
          if (dollNum !== 0) {
            basket.push(dollNum);
            board[i][cranePosition] = 0;
            if (basket.length > 1) {
              const last = basket.pop();
              const secondToLast = basket.pop();
              if (last === secondToLast) {
                deleteNum = deleteNum + 2;
              } else {
                basket.push(secondToLast);
                basket.push(last);
              }
            }
            break;
          }
        }
        cranePosition = moves.pop() - 1;
        movesLength--;
      }
    
      return deleteNum;
    }

    明日作った

  • 聴力