クレーン型抽出ゲーム(2019 KACA開発者冬季実習)


🔗 質問リンク


https://programmers.co.kr/learn/courses/30/lessons/64061

問題の説明


ゲーム開発者「Jordy」はクレーン型の抽出機をモバイルゲームに変えようとしている.
ゲームの面白さを高めるために、「Jordie」は画面レイアウトとルールをゲームロジックに反映し、以下のようにします.

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

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

クレーンが作動すると、人形が挟まないことはありませんが、人形がないところでクレーンを起動すれば、何も起こりません.また、バスケットが十分大きく、すべての人形を収容できると仮定します.(図中、スクリーン表示制限は5コマのみ表示)
ゲーム画面上の格子状態の2次元配列板と人形を挟むために、起動クレーンの位置を含む配列動作をパラメータとして指定した場合、solution関数を完了し、クレーンをすべて起動させ、爆発して消えた人形の個数を返します.

⚠▼制限


  • board配列は2次元配列であり、サイズは「5 x 5」または「30 x 30」より大きい.

  • boardの各セルには、0または100より大きい整数が含まれています.

  • 0はスペースです.

  • 1から100の数字はそれぞれ異なる人形の形を表し、同じ数字は同じ形の人形を表す.

  • moves配列のサイズは1000を超えない.

  • moves配列の各要素の値は1より大きく、board配列の水平サイズよりも自然数です.
  • 💡 プール(言語:JavaとPython)


    せきぶん
  • 人形抽出時に0に変換
  • 塀のかごに人形が入っています.そうしないと
  • です.
  • 人形を見つけて抜いたら、そのまま繰り返しの扉から
  • を脱出
  • ステップの要素は1から始まるインデックスであるため、1年周期
  • である.

    Java

    import java.util.Stack;
    
    class Solution {
        public int solution(int[][] board, int[] moves) {
            int answer = 0;
            // 뽑은 인형 담을 바구니 스택
            Stack<Integer> basket = new Stack<>();
            for (int m : moves) {
                for (int i = 0; i < board.length; i++) {
                    // 인형이 있을 때만 뽑기
                    if (board[i][m-1] != 0) {
                        // 바구니에 인형이 존재하고, 뽑은 인형과 바구니 위의 인형이 일치
                        if (!basket.isEmpty() && basket.peek() == board[i][m-1]) {
                            // 바구니에서 인형 제거, 격자에서 인형 제거, 두개씩 사라짐
                            basket.pop();
                            board[i][m-1] = 0;
                            answer += 2;
                            break;
                        // 뽑은 인형과 바구니 위의 인형이 불일치
                        } else {
                            // 바구니에 인형 넣기, 격자에서 인형 제거
                            basket.push(board[i][m-1]);
                            board[i][m-1] = 0;
                            break;
                        }
                    }
                }
            }
            return answer;
        }
    }

    Python

    def solution(board, moves):
        resultList = []
        answer = 0
        
        for k in range(len(moves)):
            for i in range(len(board)):
                if not board[i][moves[k]-1] == 0:
                    if len(resultList) == 0:
                        resultList.append(board[i][moves[k]-1])
                        board[i][moves[k]-1] = 0
                        break
                    else:
                        if resultList[-1] == board[i][moves[k]-1]:
                            del resultList[-1]
                            board[i][moves[k]-1] = 0
                            answer += 2
                            break
                        else:                       
                            resultList.append(board[i][moves[k]-1])
                            board[i][moves[k]-1] = 0
                            break
        return answer