ポンクモン


プログラマーレベル1のポンケンモンを解いた.

1.質問


長い旅行を経て、あなたはやっと洪博士の研究室に着いた.洪博士はあなたに教えて、あなたは自分の実験室の全部のN匹の携帯電話の殻の中からN/2匹を持っていくことができます.
可能な限り多くの携帯電話の保護プロセスを望んでいるので、できるだけ多くの携帯電話の保護プロセスを含むN/2を選択したいと思っています.
n個の携帯電話ガードプロセスタイプ番号を含む配列numsをパラメータとして指定すると、N/2個の携帯電話ガードプロセスを選択する方法のうち、最も多くのタイプの携帯電話ガードプロセスを選択する方法を見つけ、解法関数を完了し、当時の携帯電話ガードプロセスタイプ番号の個数を返す.
組み合わせの種類の数ではなく조합할 수 있는 최대종류가 몇 개の質問です!
問題を見ながら理解しているが、途中で理解するのを忘れているようだ.
△問題をよく読んで覚えなさい.

2.設計


問題を見れば、全部でN個の携帯電話のケースからN/2個を持ってくることができます.
結果値は最大N/2という意味です.
すなわち、結果値は、以下の2つの方法で決定される.
1)組み合わせ可能な最大タイプ数>=N/2
種類数がN/2以上の場合、結果値はN/2です.
2)組み合わせ可能な最大クラス数種類数がN/2未満の場合、結果値は종류의 수となります.
筆者は以下の順序で体現しようとした.
①最大個数(N/2)を求める.
②種類を含む配列(comp)を生成する.△重複する種類を除いて、種類ごとに1つしか持っていない.
③上記②で生成した配列に同じ種類があるか否かを判定するために変数を生成する.
④与えられた配列から1つ抽出し、上②で生成された配列の中にあるかを確認する.
⑤生成した配列にタイプがある場合は、③の変数をtrueに変換します.
生成された配列にタイプがない場合は、配列にタイプを追加します.
ㅇ生成された配列長を求める.
§結果値を決定するために、上記2つの方法で配列長(種類数)と最大個数(N/2)を比較する.
次のようにコードで表現します.

3.解答

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        // 동일한 종류가 있는지 확인하기위한 check
        boolean check = false;
        
        // 최대 선택 갯수
        int max = nums.length/2;
        // 종류를 담을 ArrayList
        ArrayList<Integer> comp = new ArrayList<Integer>();
        
        
        // 주어진 배열값 하나씩 확인
        for(int i = 0; i < nums.length; i++){
            // comp 배열과 비교
            for(int j = 0; j < comp.size(); j++){
                if(comp.get(j) == nums[i]){
                 check = true;
                 }
            }
            
            //comp배열에 없으면 comp배열에 하나씩 추가
            if(check == false){
               comp.add(nums[i]);
            }
            
            check = false;
        }
        
        if(comp.size() >= max){
           for(int c = 0; c < comp.size(); c++){
            }
            answer = max;
        }else{
            answer = comp.size();
        }

        return answer;
    }
}

4.終わったら…


当たり前ですが、問題を理解することが本当に大切です.
どんな方法で解くか考えてみましょう
実施にあたっては、import java.util.*;をメモしてから開始!