[プログラマー/レベル1]クレーン型綱引きゲーム(2019ココア開発者冬季実習)(C++)


プログラマー-Lv 1。クレーン型抽出ゲーム(2019 KACA開発者冬季実習)

1.質問



2.アクセス/チェックポイント

  • 人形が保管しているスタックを抽出する必要があります.
  • 板の配列は動作基準であるが、抜去は列を基準としなければならない.
  • ステップで与えられたインデックスに注意してください.(movesの1はboardの0)
  • 3.解決方法

  • 移動要素数繰り返し人形を抽出します.
  • このとき、この列に人形があるか確認して(0ではない)、人形があれば抜くことができます.
  • 人形を抽出する前に、人形を保管するスタックに人形があるかどうかを確認します.
  • スタックに人形がない場合は、すぐに人形をスタックに抜き(人形が爆発しないため)、boradでセルを0に変更します.
  • スタックにぬいぐるみがあれば、今つかむぬいぐるみと同じぬいぐるみかどうか確認します.
  • のような人形なら、人形を爆発させます!(回答+=2)、スタックの最上位のぬいぐるみをポップアップし、boardで0に変更します.
  • スタックのぬいぐるみが同じぬいぐるみでない場合は、直接スタックに入れ、boradから0になります.
  • 個の箱に従って、必ず人形を取り出して折って処理します.(人形は一度に1個しか抽出できないので)
  • 4.完全なコード

    #include <string>
    #include <vector>
    #include <stack>
    #include<iostream>
    using namespace std;
    
    
    int answer = 0;
    
    
    int solution(vector<vector<int> > board, vector<int> moves) {
    
        
        stack<int> doll;  //인형을 뽑아서 보관할 stack
        
        for(int i = 0; i<moves.size(); i++){
            for(int j=0; j<board.size(); j++){
    
                //board판에 인형이 있으면 뽑아야함
                if(board[j][moves[i]-1] != 0){ 
    
                   //스택에 인형이 없으면 같은지 검사 안하고 바로 스택에 넣을 수 있음
                    if(doll.empty()){
                        doll.push(board[j][moves[i]-1]); //뽑아서 stack에 넣고
                        board[j][moves[i]-1] = 0;        //board에서 뽑기 처리
                        break;                           //한 번에 인형 하나씩 뽑을 수 있음
                    }else{ //스택에 이미 인형이 있다면
                           //스택에 넣기 전에 스택의 최상단에 같은 인형이 있는지 확인해야함
                           //같은 인형이 있으면 
                        if(doll.top() == board[j][moves[i]-1]){
                            answer +=2;           //같은 인형이면 터트리기, 2개씩 터지니까 +2
                            doll.pop();           //stack에서 터진 인형 빼기
                            board[j][moves[i]-1] = 0;          //board에서 뽑기 처리
                            break;
                        }else{
                            //같은 인형이 없으면 그냥 넣기
                            doll.push(board[j][moves[i]-1]);  //뽑아서 stack에 넣고
                            board[j][moves[i]-1] = 0;         //board에서 뽑기 처리
                            break;                      
    
                        }
                    }
                }else{
                    continue;  //인형이 없으면 pass
                }
            }
        }
        return answer;
    }//end of solution

    5.注意事項


    👉 Stackを使用する場合は、stackヘッダファイルを含める必要があります.
    #include<stack>
    👉 Stack相関関数の整理
  • s.push(2); スタックに2(値)を追加します.
  • s.pop(); スタック内の最上位要素
  • を削除
  • s.top(); スタックの最上位要素
  • を返します.
  • s.size(); 戻りスタックサイズ
  • s.empty(); スタックが空の場合true
  • s.swap(s1); スタックs 1と要素置換
  • 6.他の方法を試みる


    指定した碁盤を行ごとに置換して列ごとに展開します.
    function grabDolls(transposedBoard, moves){
        let vanishedDolls = 0; // 사라진 총 인형의 수
        let stackedDolls = []; // 뽑혀서 쌓인 인형의 배열
        
        moves.map((move) => {
            // 쌓인 인형의 수
            let stackedDollsCount = stackedDolls.length;
          	// 만일 집게가 간 열에 인형이 존재한다면, (인형이 없을 수 있음)
            if(transposedBoard[move-1].length > 0){
                // 집게에 잡힌 인형은 첫번째 인형
                let grabbedDoll = transposedBoard[move-1].shift();
                // 쌓인 인형이 있고, 맨 위에 쌓인 인형이 집게에 잡힌 인형과 같은 인형이라면 쌓인 인형 없애기
                if(stackedDollsCount > 0 && 
                    stackedDolls[stackedDollsCount-1] 
                    === grabbedDoll){
                    stackedDolls.pop();
                    // 인형은 한번에 2개씩 사라지기 때문에 2개 더하기
                    vanishedDolls += 2;
                }else {
                    // 만일 쌓여있던 인형과 일치하지 않으면 인형을 그냥 쌓기
                    stackedDolls.push(grabbedDoll);
                }
            }
        });
    
        // 총 사라진 인형이 정답
        return vanishedDolls;
    }
    コードソース

    7.後期


    boardの実行基準なので、最初は少し混同していましたが、問題自体は単純な問題のようです.
    問題自体もスタックを使うことを教えてくれました…!