[プログラマー][Python]ポンケンモン


📃 問題の説明


長い旅行を経て、あなたはやっと洪博士の研究室に着いた.洪博士はあなたに教えて、あなたは自分の実験室の全部のN匹の携帯電話の殻の中からN/2匹を持っていくことができます.
ホン博士研究室のボンケンモンは種類番号で区別されている.そのため、同じタイプの携帯電話のガードプロセスには同じ番号があります.例えば、研究室に4つの携帯電話のケースがある場合、各携帯電話のケースの種類番号は[3号、1号、2号、3号]で、3号携帯電話のケースが2つ、1号携帯電話のケースが2つ、2号携帯電話のケースが2つあることを示しています.このとき、4つのケースの中から2つを選ぶ方法は、以下の6つがあります.
  • 第1回(3回)、第2回(1回)携帯電話守護プロセスを選択
  • 第1回(3回)、第3回(2回)携帯電話守護プロセスを選択
  • 1つ目(3つ目)、4つ目(3つ目)携帯電話ガードプロセスを選択
  • 2番目(1)、3番目(2)携帯電話のデーモンを選択
  • 2番目(1)、4番目(3)携帯電話のデーモンを選択
  • 3つ目(2つ目)、4つ目(3つ目)携帯電話ガードプロセスを選択
  • この場合、1番目(3番)のphonecketmonと4番目(3番)のphonecketmonを選択する方法は1つ(3番のphonecketmonの2つ)のphonecketmonしかありませんが、他の方法は2つのphonecketmonがあります.したがって、上記の例では、携帯電話のケースタイプ数の最大値は2です.
    可能な限り多くの携帯電話の保護プロセスを望んでいるので、できるだけ多くの携帯電話の保護プロセスを含むN/2を選択したいと思っています.n個の携帯電話ガードプロセスタイプ番号を含む配列numsをパラメータとして指定すると、N/2個の携帯電話ガードプロセスを選択する方法のうち、最も多くのタイプの携帯電話ガードプロセスを選択する方法を見つけ、解法関数を完了し、当時の携帯電話ガードプロセスタイプ番号の個数を返す.
    せいげんじょうけん
  • numsは、携帯電話のデーモンプロセスのタイプ番号を含む1次元配列です.
  • numsの長さ(N)は1または10000未満であり、常に偶数である.
  • Phonecket Monsterのタイプ番号は、1または200000以下の自然数で表示されます.
  • 最も多くのタイプの携帯電話のデーモンを選択する方法が複数ある場合は、選択可能な最大1つの携帯電話のデーモンタイプの値を返すだけです.
  • I/O例
    numsresult[3,1,2,3]2[3,3,3,2,2,4]3[3,3,3,2,2,2]2
    I/O例説明
    I/O例#1
    問題の例.
    I/O例#2
    ケースが6つあるのでケースを3つ選びます
    最も多くの種類の携帯電話のケースを選ぶために、3番の携帯電話のケース、2番の携帯電話のケース、4番の携帯電話のケースを選んで、それから3に戻ることができます.
    I/O例#3
    ケースが6つあるのでケースを3つ選びます
    最も種類の多い携帯電話のケースを選ぶためには、3番の携帯電話のケースと2番の携帯電話のケースを1匹、または3番の携帯電話のケースを2匹、3番の携帯電話のケースを1匹選ぶことができます.そのため、最大選択可能なケースのタイプ数は2です.

    💻 問題を解く

    def solution(nums):
        # len(nums)//2      : 골라야 하는 폰켓몬 수
        # len(set(nums))    : 중복값을 제외한 폰켓몬 종류의 수
    
        if len(nums)//2 < len(set(nums)):       
            return len(nums)//2
        else:
            return len(set(nums))

    キー(Key)

  • set()利用

  • 例を挙げて説明すると分かりやすいようです.
    """예시1"""
    nums = [3,3,3,2,2,2]
    
    """
    # 골라야 하는 폰켓몬 수		: 3개 (6//2)
    # 중복값을 제외한 폰켓몬 종류의 수	: 2개 (set(nums) => {3,2})
    
    
    3개를 골라야 하는 입장에서 가장 많은 종류를 골라야 하는데,
    중복값을 제외한 폰켓몬 종류의 수는 2개 밖에 없다.
    그러면 결국 최대값은 2이다.
    """
    """예시2"""
    nums = [1,2,3,4]
    
    """
    # 골라야 하는 폰켓몬 수		: 2개 (4//2)
    # 중복값을 제외한 폰켓몬 종류의 수	: 4개 (set(nums) => {1,2,3,4})
    
    
    2개를 골라야 하는 입장에서 가장 많은 종류를 골라야 하는데,
    중복값을 제외한 폰켓몬 종류의 수는 4개씩이나 있다.
    그러면 결국 4개중 2개 아무거나 고르면 되기 때문에 최대값은 2이다.
    """

    シングルラインエンコーディング

    min()を使用して、2つの小さな値の関数を返します.
    def solution(nums):
        return min(len(nums)//2 , len(set(nums)))