[プログラマーLv 2.]メニュー更新(Python)

8988 ワード

1.質問


問題の説明


せいげんじょうけん


にゅうしゅつりょく


I/O例


2.解法


私が考えている過程

  • まず、可能なすべてのコースメニューを組み合わせて、各コースの数を表示する用語集を作成します(new menu={'Ac':2,,,,,,,,,,,})
  • この場合、メニューをソートしてdictionaryを作成する必要があります->ここでソートしない場合、XWとWXは異なる
  • とみなされます.
  • new menu(sort menu)
  • sort menuの最初の値の個数は最大値です.sort menu=[];sort menuに何かがあればmymax
  • を得ることができる
  • mymaxを取得した場合、sort menuサイクルでmymaxと同じ数を持っている場合は、答えの
  • に入れます.

    コード#コード#

    from itertools import combinations
    
    def solution(orders, course):
        answer = []
        for c in course:
            candidates = []
            new_menu = {}
            for menu in orders:
                menu_li = list(''.join(menu))
                for li in combinations(menu_li, c):
                    res = ''.join(sorted(li))  # 여기서 정렬안해주면, XW, WX를 다른것으로 인식함
                    if res not in new_menu:
                        new_menu[res] = 1
                    else:
                        new_menu[res] += 1
            sort_menu = sorted(new_menu.items(), reverse=True, key=lambda x: x[1])
    
            if len(sort_menu):  # sort_menu = []일 수 있음
                mymax = sort_menu[0][1]
    
                if mymax > 1:
                    for i in sort_menu:
                        if i[1] == mymax:
                            answer.append(i[0])
    
        answer = sorted(answer)
    
        return answer

    3.異なる解法

  • すべての可能な組み合わせを見つけ、各組み合わせの個数に基づいて最も多いメニューを選択する->時間の複雑さを増やす+特定の個数が最も多いメニューを見つけるのは難しい
  • カウンタの使用-ディック・シリーズを使用して数量を決定
  • counter関数は、アレイに表示される要素の数を簡単に説明します.
  • ディックシリーズ
  • は不要
  • カウンタのmost common()メソッドは、データ数順に配列された配列
  • を返すことができる.
    from itertools import combinations
    from collections import Counter
    def solution(orders, course):
        answer = []
        for k in course:
            candidates = []
            for menu_li in orders:
                for li in combinations(menu_li, k):
                    res = ''.join(sorted(li))
                    candidates.append(res)
                    
            sorted_candidates = Counter(candidates).most_common()
            answer += [menu for menu, cnt in sorted_candidates if cnt > 1 and cnt == sorted_candidates[0][1]]
            
        return sorted(answer)