Search
Duplicate

순위 검색

문제 설명 및 제한사항

아이디어 및 해결 방법

코드

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