[programmers]クレーン人形を捕まえるゲーム


クレーン人形をつかむゲーム-JavaScriptを解読する


👉 プログラマ質問リンク

解題ロジック

  • が並んだ一番前を移動してから、1人1つの数字を出します.
  • 1から取り出した数字を2 D配列ボードの2番目のインデックスとして指定し、1番目のインデックス値を変更して値を確認します.

    2-1. 列に0以外の要素が含まれている場合は、値を返し、要素の値を0に変更します.
    2-2. 列にゼロ以外の要素がない場合は、0
  • を返します.
  • 2で確認された数字を個別のコンテナマトリクスに格納
    3-1. 2から抽出した数字が0の場合、コンテナには格納されません.
    3-2. 2から抽出した数字が0ではなく、コンテナが空の場合は、直接数字を保存します.
    3-3. 2から抽出した数字が0ではなく、容器が空ではない場合、容器の最後の数字を2から抽出した数字と比較します.
    3-3-1. 比較する数字が違うと、数字を保存します.
    3-3-2. 比較した数値が同じ場合は、コンテナの最後の数を削除し、count変数の値を2に増やします.
  • 3−3プロセスは、移動配列の長さまで繰り返される.以上の論理用コードは以下のように実現される.
    function solution(board, moves) {
      let count = 0;
      const boardLength = board.length; // 반복문 시행 시 매번 length를 계산하지 않도록 미리 변수로 설정
      const movesLength = moves.length; // 반복문 시행 시 매번 length를 계산하지 않도록 미리 변수로 설정
      const container = []; // 뽑은 숫자(인형)을 저장할 별도의 배열
      
      // 2차원 배열 board에서 숫자를 확인해서 뽑는 과정을 구현한 함수
      const selectNumber = function(seletedColumn){
          for(let i = 0; i < boardLength; i++){
              // 선택 된 열의 모든 행의 값을 확인하며 0이 아닌 수를 찾는 과정 
              if(board[i][seletedColumn]){
                  const result = board[i][seletedColumn]; // 0이 아닌수를 result에 저장
                  board[i][seletedColumn] = 0; // 해당 요소의 값은 0으로 변경 (인형이 제거됨을 의미)
                  return result; // result를 리턴
              }
          }
          return 0; // 0이 아닌 값을 찾지 못했다면 0을 리턴 (해당 열에는 인형이 없음을 의미)
      }
      
      // 뽑은 숫자(인형)을 별도의 컨테이너에 저장하는 과정을 구현한 함수
      const pushToContainer = function(selectedNumber){
          // 1. 뽑은 숫자가 0이면 함수를 종료한다.
          if(!selectedNumber) return;
          // 2. 컨테이너가 비어있다면 숫자를 그냥 저장한다.
          if(container.length === 0){
              container.push(selectedNumber);
              return; 
          }
          // 3. 컨테이너가 비어있지 않다면 기존 저장된 숫자와 새로 뽑은 숫자를 비교한다.
          // 3-1. 비교한 숫자가 다르면 숫자를 그냥 저장한다.
          // 3-2. 비교한 숫자가 같으면 컨테이너의 마지막 숫자를 제거하고 count의 값을 2 증가시킨다.
          if(selectedNumber !== container[container.length-1]){
              container.push(selectedNumber);
              return;
          } else if(selectedNumber === container[container.length-1]){
              container.pop();
              count+=2;
              return;
          }
      }
      
      // 실제 코드 동작부 - moves 배열의 원소를 순회하며 selectNumber 함수와 pushToContainer 함수를 호출
      for(let i = 0; i < movesLength; i++){
          const seletedColumn = moves[i]-1;
          pushToContainer(selectNumber(seletedColumn));
      }
      
      return count;
    }