2021 KAO BLINDメニュー更新
15264 ワード
質問する
問題は次のとおりです.
https://programmers.co.kr/learn/courses/30/lessons/72411
入力
orders
:お客様が注文した単品メニューを文字列で並べるcourse
:追加したいセット数を含む単品メニューの並び新しく追加されたコース料理のメニュー構成を含む文字列配列.
方法
最初は交差で解きたいと思っていました.
まず、内部文字列の長さに基づいてOrdersをソートします.
長さの小さいorderから、後ろのorder交差要素を順に
一つの方法を考えて盛り付けながら、重ねたメニューを数えました.
しかし、問題があることに気づき、問題を読み直した.
ordersの要素orderをnと見なし、courseの要素cをrと見なしたらどうですか.
想像してみてくださいnCrnCrn
orders : ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
order(=forin orders)でrをマージすると
orderのr個の組合せを求めることができる.
結果をdictionaryに入れてcountを行い、ordersでループを行い、終了後にcourseループを行い、すべての組合せ状況を含む数とそのcountを含むdictionaryを求める.
そのコードは以下の通りです.
import itertools
def solution(orders, course):
answer = []
# n_C_r
dic_course = dict()
while course:
r = course.pop(0)
for order in orders:
if len(order) >= r:
for _course in list(itertools.combinations(order, r)):
_course = tuple(sorted(list(_course)))
if _course not in dic_course:
dic_course[_course] = 1
else:
dic_course[_course] += 1
上記コード生成を実行するdic_course
出力は以下の通り.countが完了するまで、問題の条件をチェックすることはできません.すなわち、重複メニューの数は2より大きくなければなりません.そのため、値は1も含まれます.
dic_course
鍵の長さにより、最も価値のある鍵を見つける必要があるまずlen(key)(昇順)とvalue(降順)で並べ替えます.
以下のとおりです.
dic_course = sorted(dic_course.items(), key = lambda x : (len(x[0]), -x[1]))
次にdic courseで答えに対応するキーを探し、見つけたらsortを行いstring typeに変換し、答えに挿入します.このようにdic courseを巡回し、答えの要素がすべて埋め込まれた後、ソート(response)を返します.コードは以下の通りです.
now_len = len(dic_course[0][0])
max_cnt = dic_course[0][1]
for key , val in dic_course:
if val == 1: continue
if len(key) > now_len:
max_cnt = val
now_len = len(key)
answer.append("".join(sorted(list(key))))
elif len(key) == now_len:
if max_cnt == val:
answer.append("".join(sorted(list(key))))
answer = sorted(answer)
return answer
完全なコード
import itertools
def solution(orders, course):
answer = []
# 조합이라니...
# n_C_r
dic_course = dict()
while course:
r = course.pop(0)
for order in orders:
if len(order) >= r:
for _course in list(itertools.combinations(order, r)):
_course = tuple(sorted(list(_course)))
if _course not in dic_course:
dic_course[_course] = 1
else:
dic_course[_course] += 1
dic_course = sorted(dic_course.items(), key=lambda x: (len(x[0]), -x[1]))
# print(dic_course)
now_len = len(dic_course[0][0])
max_cnt = dic_course[0][1]
for key, val in dic_course:
if val == 1: continue
if len(key) > now_len:
max_cnt = val
now_len = len(key)
answer.append("".join(sorted(list(key))))
elif len(key) == now_len:
if max_cnt == val:
answer.append("".join(sorted(list(key))))
answer = sorted(answer)
return answer
Reference
この問題について(2021 KAO BLINDメニュー更新), 我々は、より多くの情報をここで見つけました https://velog.io/@superyodi/2021-KAKAO-BLIND-메뉴-리뉴얼テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol