[プログラマー]クレーン人形をつかむ


1.質問


問題の説明


2019年のKACA開発者の冬のインターンシップでの問題です.板に人形を初期化し、クレーンで人形を掛け、別の場所に保存します.貯蔵されたぬいぐるみのうち、2つ以上のぬいぐるみが集まった場合、ぬいぐるみの爆発に伴って爆発したぬいぐるみの数が戻されます.
詳細は添付リンク.

せいげんじょうけん

  • ボードアレイは2次元アレイであり、サイズは5 x 5または30 x 30以下である.
  • boardの各セルには、0または100以下の整数が含まれています.
  • 0はスペースを表します.
  • 1-100の各数字は異なる人形の形を表し、同じ数字は同じ人形の形を表す.
  • モバイルアレイのサイズは1000を超えません.
  • movies配列の各要素の値は1より大きく、自然数であり、スラブ配列の水平寸法より小さい.
  • I/O例


    boardmovesreturn[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]][1,5,3,5,1,2,1,4]4

    2.アイデア


    引き揚げられた人形を保存するリストを
  • クレーンで作成します.
    リストを使用する理由:便利です.要素を削除すると、そのサイズも小さくなり、削除と挿入が容易になります.
  • ステップの各要素を-1してプレートに近いように配列する[][].
  • 2のfor文は、配列板の各要素に近づき、0でなければ取り出します.取り出したインデックスの値は0になります.
  • で収集されたぬいぐるみの数が2個を超える場合、同じぬいぐるみが連続して集まっているかどうかをチェックし、もしそうであれば、そのアイテムをリストから削除し、答えに2を追加します.이거때문에 다 해놓고 좀 해맸다
  • 3.コード

    public class KakaoCrain {
        public static  int solution(int[][] board, int[] moves) {
            int answer = 0;
            List<Integer>store = new ArrayList<>();//크레인으로 건져올린 인형들이 저장되는 배열
            //moves[i]의 값에 해당하는 board[*][i]를 찾아서 그 값을 store에 저장한다.
            for(int i = 0 ; i < moves.length;i++){
                int col = moves[i]-1;
                for(int j = 0; j < board[col].length; j++){
                    if(board[j][col]!=0){
                        store.add(board[j][col]);
                        board[j][col] = 0;
                        break;
                    }
                }
                //store[]에 같은 것이 두번연속해서 쌓이면 PANG
                if(store.size() >= 2) {
                    if (store.get(store.size()-2) == store.get(store.size()-1)) {
                        store.remove(store.size()-1);
                        store.remove(store.size()-1);
                        answer+=2;
                    }
                }
    
            }
            return answer;
        }
    
        public static void main(String[] args) {
            int[][] b = {{0,0,0,0,0},{0,0,1,0,3},{0,2,5,0,1},{4,2,4,4,2},{3,5,1,3,1}};
            int[] m = {1,5,3,5,1,2,1,4};
    
    
            System.out.println(solution(b, m));
        }
    }
    初めて問題を見たときはスタックで解けると思っていましたが、スタックにはあまり詳しくないのでリストで解きました.
    問題を解いた後、他の人が問題を解いているのを見ていると、スタックで問題を解いている人がいるので、そのコードを添付しました.
    class Solution {
        public int solution(int[][] board, int[] moves) {
            int answer = 0;
            Stack<Integer> stack = new Stack<>();
            for (int move : moves) {
                for (int j = 0; j < board.length; j++) {
                    if (board[j][move - 1] != 0) {
                        if (stack.isEmpty()) {
                            stack.push(board[j][move - 1]);
                            board[j][move - 1] = 0;
                            break;
                        }
                        if (board[j][move - 1] == stack.peek()) {
                            stack.pop();
                            answer += 2;
                        } else
                            stack.push(board[j][move - 1]);
                        board[j][move - 1] = 0;
                        break;
                    }
                }
            }
            return answer;
        }
    }
    スタックを使用する場合は、新しいアイテムをスタックに入れる前に、スタックの一番上の要素と比較します.

    4. end..


    これはLevel 1の簡単な問題ですが、コードを書くのは一度もありません.何度もデバッグしましたが...
    問題をよく読んで、次のコードを書くときに何の目的があるのかを注釈する練習をします.