문제 설명 및 제한사항
아이디어 및 해결 방법
코드
from collections import defaultdict
from copy import deepcopy
import itertools
import bisect
def solution(info, query):
# lang = cpp, java, python
# group = backend, frontend
# exp = junior, senior
# food = chicken, pizza
lang, group, exp, food = defaultdict(set), defaultdict(set), defaultdict(set), defaultdict(set)
id2score = dict()
full_ids = set()
answer = []
for id, s in enumerate(info):
l, g, e, f, score = s.split()
score = int(score)
full_ids.add(id)
lang[l].add(id)
group[g].add(id)
exp[e].add(id)
food[f].add(id)
id2score[id] = score
# 나올 수 있는 모든 query의 조합에 따른
# score 리스트를 미리 만들어 둡니다.
precompiled_scores = dict()
for l, g, e, f in itertools.product(
['cpp', 'java', 'python', '-'],
['backend', 'frontend', '-'],
['junior', 'senior', '-'],
['chicken', 'pizza', '-'],
):
ids = deepcopy(full_ids)
if l != '-':
ids &= lang[l]
if g != '-':
ids &= group[g]
if e != '-':
ids &= exp[e]
if f != '-':
ids &= food[f]
scores = [id2score[id] for id in ids]
scores.sort()
precompiled_scores[(l, g, e, f)] = scores
for q in query:
l, g, e, f_score = q.split(' and ')
f, score = f_score.split()
score = int(score)
scores = precompiled_scores[(l, g, e, f)]
i = len(scores) - bisect.bisect_left(scores, score)
answer.append(i)
return answer
Python
복사
출처
프로그래머스 코딩테스트 연습 https://school.programmers.co.kr/learn/challenges