1 minute read

출처

https://school.programmers.co.kr/learn/courses/30/lessons/72412

풀이

# 요약 
## 개발언어는 cpp, java, python 중에 하나 선택
## backend, frontend 중에 하나 선택
## 지원경력 junior 와 senior 중에 하나 선택
## 소울푸드는 chicken과 pizza 중에 하나 선택
## 위의 4가지와 점수를 통한 쿼리가 가능하다.

# 전략
## 모든 검색할수 있는 조건들에 대해 데이터베이스를 만들자
## 그러면 어떤 쿼리에도 결과를 내놓을수 있다.
## 조건을 고려하거나 안고려거나 각각의 조건별로 2개이므로 하나의 지원자들에 대해 2^4=16 개이다.
## 16*50000 이면 시간복잡도상으로 해볼만 하다.
## 그리고 미리 점수별로 정렬을 해서 데이터데이스에 넣으면
## 각각의 조건에 대해서 가장 낮은 점수부터 들어가므로
## 몇점 이상 받은 사람들을 골라 낼때 도움이 될것이다.

from collections import defaultdict
from bisect import bisect_left

def solution(infos, queries):
    infos = [info.split() for info in infos]
    
    for info in infos:
        info[-1] = int(info[-1])
    
    infos = sorted(infos, key=lambda info: info[-1])
    
    DB, answer = defaultdict(list), []
    
    for info in infos:
        # bit mask로 깔쌈하게해보았다!!1
        for mask in range(16):
            key = ''.join([
                info[0] if mask&1 else "-",
                info[1] if mask&2 else "-",
                info[2] if mask&4 else "-",
                info[3] if mask&8 else "-",
            ])
            DB[key].append(info[-1])
    
    for query in queries:
        q = query.split()
        q, score = ''.join([q[0], q[2], q[4], q[6]]), int(q[-1])
        result = DB[q]
        
        # result의 갯수가 6개
        # 가장 최소 인덱스가 2라면
        # 6-2 = 4개가 조건을 만족하는 닝겐들이 된다.
        answer.append(len(result) - bisect_left(result, score))

    return answer

Leave a comment