[アルゴリズム]プログラマー-クレーン型綱引きゲーム


https://programmers.co.kr/learn/courses/30/lessons/64061
問題の説明
ゲーム画面上の格子状態の2次元配列板と人形を挟むために、起動クレーンの位置を含む配列動作をパラメータとして指定した場合、solution関数を完了し、クレーンをすべて起動させ、爆発して消えた人形の個数を返します.
この問題は操作図を見なければ理解できないので、そのリンクに入って問題を読んでください.
せいげんじょうけん
  • ボードアレイは2次元アレイであり、サイズは5 x 5または30 x 30以下である.
  • boardの各セルには、0または100以下の整数が含まれています.
  • 0はスペースを表します.
  • 1-100の各数字は異なる人形の形を表し、同じ数字は同じ人形の形を表す.
  • モバイルアレイのサイズは1000を超えません.
  • movies配列の各要素の値は1より大きく、自然数であり、スラブ配列の水平寸法より小さい.
  • I/O例

    解決策
    コードに記入します
    function solution(board, moves) {
        let stack =[]; // 크레인으로 옮긴 인형을 담을 stack
        let count=0; // 터트려진 인형 개수를 담을 변수
      
     
      //외부 for문은 moves의 순서대로 작동해야하기때문에 moves의 길이만큼 순회함
        for(let i = 0; i < moves.length; i++){
          // 각 i에 대해 board에서 값을 찾아준다
            for(let j = 0; j < board.length; j++){
              // 탐색 대상이 되는 column에 인형이 있는지 확인
                if(board[j][moves[i]-1]){ 
                  // 스택의 끝 값과 스택에 새로 넣을 값이 같을때는 두개 모두 터트리기
                    if(stack.length && stack[stack.length-1]===board[j][moves[i]-1]){
                        stack.pop();
                        count+=2;
                    }else{
                      //새로넣을값과 스택의 끝 값이 같지않으면 스택에 값 넣어주기
                        stack.push(board[j][moves[i]-1]);    
                    }
                    board[j][moves[i]-1] = 0;
                    break;
                }
            }
        }
        return count;
    }