[白俊]1652号カード(Python 3)


https://www.acmicpc.net/problem/11652
カード番号を与え、最も多くのカード番号を出力する問題.(数量が冗長の場合、最小数量を出力)

私の最初の答え

  • 入力カードの数をハッシュ値で表す、
  • .
  • カードの数をソート(逆順最大値でソート)
  • .
  • で最も多いグラフィックスカードの中で最も少ないのは
  • です.
    上記の論理を実現した.
    import sys
    
    n = int(sys.stdin.readline())
    dic = {}
    answer_nums = []
    
    for i in range(n): #딕셔너리로 가지고 있는 카드와 개수를 표현
        input_num = int(sys.stdin.readline())
    
        if input_num not in dic.keys():
            dic[input_num] = 1
        else:
            dic[input_num] += 1
    
    dic_list = sorted(dic.items(), key=lambda x : x[1], reverse=True) #카드의 개수를 기준으로 역순으로 정렬
    
    biggest = dic_list[0][1] # 
    answer_nums.append(dic_list.pop(0)[0])
    while len(dic_list) != 0:
        next_biggest= dic_list[0][1]
        if biggest != next_biggest:
            break
        else:
            answer_nums.append(dic_list.pop(0)[0])
    
    answer_nums.sort()
    print(answer_nums.pop(0))
    ソート()関数を使用して、次のリストでソートします.
    [(3, 3), (2, 3), (1, 1)]
    value値を基準として並べ替えられているので、キー値に対応する3、2は入力された順序対(stable sorting)並べ替えである.
    従って,最後のbiggetからvalue最大値からキー値最小値を出力する論理が実現される.
    ただし、これらのコードは必要ありません.ソート()関数を用いてソートする場合,lambdaに2つの条件を加えると簡単に解くことができる.

    私の2番目の答え

    import sys
    
    n = int(sys.stdin.readline())
    dic = {}
    answer_nums = []
    
    for i in range(n):
        input_num = int(sys.stdin.readline())
    
        if input_num not in dic.keys():
            dic[input_num] = 1
        else:
            dic[input_num] += 1
    
    dic_list = sorted(dic.items(), key=lambda x : (-x[1], x[0]))
    print(dic_list[0][0])
    {key:value}形式のバイナリで上記のソートを行うと、値の大きい値からソートし、キー値の小さい値からソートすることができるので、ソート後の最初のキー値を出力すると簡単に答えが得られます.

    これはコードが短く、時間が短く、簡単な解題方法です.