[ココア出力]ランキング検索/Python/資料構造と探索
ランキング検索
回答:https://programmers.co.kr/learn/courses/30/lessons/72412
質問する
サポート担当者がサポート書に入力した4つの情報と、得られた符号化テスト点数を1つの文字列に構成する場合、配列情報および開発チームが好奇心を持っているクエリー条件が文字列形式で提供される配列クエリーをパラメータとする場合.
解答関数を完了し、各ドアの条件に合致する人数を順番に並べて返してください.
せいげんじょうけん
-開発言語はcpp、java、pythonです.
-直結はbackendとfrontendの1つです.
-経歴は大学3年生、大学4年生の1人です.
-ソウルフードは鶏肉とピザの一つです.
-スコアは、符号化テストスコアを表し、自然数は1または100000未満である.
-各単語はスペースで区切られます.
-[条件]は、「言語と職業、経歴、魂の食品を開発する」形式の文字列です.
-言語はcpp、java、python、および-の1つです.
-直軍はbackend、frontend、-その一つです.
-経歴は中学校、高校-その一つです.
-ソウルフードは鶏肉、ピザです.-その一つです.
-「-」は、これらの条件を考慮しないことを示します.
-Xはコードテスト点数を表し、条件を満たす人の中で、X点以上の人は何人いますか.
-各単語はスペースで区切られます.
-例えば、「cpp and-andhigher and pizza 500」「cppでコードテストを行い、経験は高齢者で、pizzaとしてsoulfoodを選んだ応募者のうち、コードテスト点数500点以上を獲得した人は何人いますか?」に表示されます.
解答方法
リファレンス
from itertools import combinations as combi
from collections import defaultdict
def solution(infos, queries):
answer = []
info_dict = defaultdict(list)
for info in infos:
info = info.split()
info_key = info[:-1]
info_val = int(info[-1])
for i in range(5): # 4가지의 정보에 대해 16가지의 조합
for c in combi(info_key, i):
tmp_key = "".join(c)
info_dict[tmp_key].append(info_val)
for key in info_dict.keys(): # 각 value(코딩테스트 점수)를 오름차순 정렬
info_dict[key].sort()
for query in queries:
query = query.split(' ')
query_score = int(query[-1])
query = query[:-1]
tmp_q = ''.join(query)
tmp_q = tmp_q.replace('and', '')
tmp_q = tmp_q.replace('-', '')
# lower bound(원하는 값 이상이 처음 나오는 위치를 탐색)
if tmp_q in info_dict:
scores = info_dict[tmp_q]
if len(scores) > 0:
start, end = 0, len(scores)
# binary search
while end > start:
mid = (start + end) // 2
if scores[mid] >= query_score:
end = mid
else:
start = mid + 1
answer.append(len(scores) - start)
else:
answer.append(0)
return answer
Reference
この問題について([ココア出力]ランキング検索/Python/資料構造と探索), 我々は、より多くの情報をここで見つけました https://velog.io/@dhelee/카카오-기출-순위-검색-Python-자료구조탐색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol