문제 설명 및 제한사항
아이디어 및 해결 방법
코드
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