문제 링크 : programmers.co.kr/learn/courses/30/lessons/72412
코딩테스트 연습 - 순위 검색
["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt
programmers.co.kr
파이썬에 익숙하지 않지만 도저히 자바나 c++로 풀기는 싫은 문제였다. 오랜만에 파이썬 감좀 익힐겸 시작했지만 그 전에도 잘하지 못했어서 좋은 코드를 만들진 못했다. 앞으로 종종 파이썬 코드로 연습 해봐야겠다.
문제에서 주어지는 쿼리에 '-'가 있을 경우가 까다로웠는데 info에 대해서 해당 항목이 들어갈 때와 안들어가는 경우의 조합 16개를 모두 저장하는 방법으로 해결했다. 그에 해당하는 score를 이분탐색으로 개수를 파악했다.
from itertools import combinations
import collections
def solution(info, query):
answer = []
lists = collections.defaultdict(list)
for x in info:
infos = x.split(' ')[0:5]
info_key = infos[:-1]
info_val = int(infos[-1])
for size in range(0,5):
for c in combinations(info_key,size):
tmp_key = ''.join(c)
lists[tmp_key].append(info_val)
for key in lists.keys():
lists[key].sort()
for x in query:
x = x.split(' ')
query_score = int(x[-1])
x = x[:-1]
while x.__contains__('and'):
x.remove('and')
while x.__contains__('-'):
x.remove('-')
x = ''.join(x)
if x not in lists:
answer.append(0)
continue
scores = lists[x]
left = 0
right = len(scores)
while left < right:
mid = (left+right) // 2
if scores[mid] >= query_score:
right = mid
else:
left = mid+1
answer.append(len(scores) - left)
return answer