[programmers]순위 검색

데린이·2022년 4월 27일
0

주어진 query 조건에 맞는 데이터 수 출력
https://programmers.co.kr/learn/courses/30/lessons/72412

22-04-27 code

from collections import Counter


def solution(info, query):
    answer = []
    
    lan = {'cpp':[],'java':[],'python':[],'-':list(range(len(info)))}
    part = {'backend':[],'frontend':[],'-':list(range(len(info)))}
    career = {'junior':[],'senior':[],'-':list(range(len(info)))}
    food = {'chicken':[],'pizza':[],'-':list(range(len(info)))}
    for i, apply in enumerate(info):
        lan[apply.split(" ")[0]].append(i)
        part[apply.split(" ")[1]].append(i)
        career[apply.split(" ")[2]].append(i)
        food[apply.split(" ")[3]].append(i)
     
    for q in query:
        q_ = q.split(" ")
        
        q_score = int(q_[7])
        answer_set = set(lan[q_[0]]) & set(part[q_[2]]) & set(career[q_[4]]) & set(food[q_[6]])
        
        if len(answer_set) > 0:
            answer.append(len([i for i in list(answer_set) if int(info[i].split(" ")[4]) >= q_score]))
        else:
            answer.append(0)
        
    return answer

효율성 테스트 fail

Tips.
1. info에 없는 조건들이 query에 있을 수 있습니다. 모든 경우의 수를 넣지 않으면 런타임 에러가 발생합니다.
2. 단순히 봐도 info 50,000개 x query 100,000개 = 50억개. 하나씩 비교해선 답이 없습니다. 해시테이블을 사용합시다.
3. 점수를 비교할 때조차 시간을 아껴야 통과합니다. 선형탐색 말고 이진탐색 같은 빠른 방법을 쓰세요!

22-05-10 code

효율성 테스트 fail
1. bisect_left를 사용할 것.
이분법 사용을 위주로 전체 구성을 짜자!

=> 문제를 보고 가장 계산이 많은 곳을 확인
=> 계산이 많은 곳이 효율적으로 코드가 구성되어 질 수 있도록 전체 구성 짜기

22-06-01 code

효율성 테스트 fail

Next what to do.
1. key: 점수를 제외한 조건, value: 점수 인 dictionary를 만든다.
2. 해당 dictionary value들을 sort한다.
3. bisect 방법을 사용한다

22-07-08 code

def solution(info, query):
    from bisect import bisect_left

    # generate dict for info
    info_dict = {}
    for lan in ['cpp','java','python','-']:
        for part in ['backend','frontend','-']:
            for career in ['junior','senior','-']:
                for food in ['chicken','pizza','-']:
                    info_dict[lan+' '+part+' '+career+' '+food] = []

    # key: letter conditions, value: score
    for nfo in info:
        letter_cond = nfo.split(' ')[:-1]
        score = float(nfo.split(' ')[-1])

        info_dict[' '.join(letter_cond)].append(score)
        info_dict["- - - -"].append(score)

        for i in range(4):
            cond = letter_cond.copy()
            cond[i] = '-'
            info_dict[' '.join(cond)].append(score)

            for j in range(i+1,4):
                cond2 = cond.copy()
                cond2[j] = '-'
                info_dict[' '.join(cond2)].append(score)

                for k in range(j+1,4):
                    cond3 = cond2.copy()
                    cond3[k] = '-'
                    info_dict[' '.join(cond3)].append(score)



    # sort score
    for key,value in info_dict.items():
        info_dict[key] = sorted(value)

    answer = []
    for q in query:
        condition = q.replace(' and','').split(' ')
        scores = info_dict[' '.join(condition[:-1])]
        answer.append(len(scores)-bisect_left(scores,float(condition[-1])))

    return answer
profile
취뽀를 기원하는 취준생입니다!

0개의 댓글