주어진 query 조건에 맞는 데이터 수 출력
https://programmers.co.kr/learn/courses/30/lessons/72412
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. 점수를 비교할 때조차 시간을 아껴야 통과합니다. 선형탐색 말고 이진탐색 같은 빠른 방법을 쓰세요!
효율성 테스트 fail
1. bisect_left를 사용할 것.
이분법 사용을 위주로 전체 구성을 짜자!
=> 문제를 보고 가장 계산이 많은 곳을 확인
=> 계산이 많은 곳이 효율적으로 코드가 구성되어 질 수 있도록 전체 구성 짜기
효율성 테스트 fail
Next what to do.
1. key: 점수를 제외한 조건, value: 점수 인 dictionary를 만든다.
2. 해당 dictionary value들을 sort한다.
3. bisect 방법을 사용한다
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