[ココア出力]ランキング検索/Python/資料構造と探索


ランキング検索


回答:https://programmers.co.kr/learn/courses/30/lessons/72412

質問する


サポート担当者がサポート書に入力した4つの情報と、得られた符号化テスト点数を1つの文字列に構成する場合、配列情報および開発チームが好奇心を持っているクエリー条件が文字列形式で提供される配列クエリーをパラメータとする場合.
解答関数を完了し、各ドアの条件に合致する人数を順番に並べて返してください.

せいげんじょうけん

  • info配列のサイズは50000を超えない.
  • info配列の各要素の値は「開発言語職業経歴魂食品点数」の形式であり、ボランティアが申請書に入力した4つの値をコードテスト点数に加算する.
    -開発言語はcpp、java、pythonです.
    -直結はbackendとfrontendの1つです.
    -経歴は大学3年生、大学4年生の1人です.
    -ソウルフードは鶏肉とピザの一つです.
    -スコアは、符号化テストスコアを表し、自然数は1または100000未満である.
    -各単語はスペースで区切られます.
  • query配列のサイズは100000を超えません.
  • queryの各文字列は、「[条件]X」形式です.
    -[条件]は、「言語と職業、経歴、魂の食品を開発する」形式の文字列です.
    -言語は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