카카오 블라인드 2021, 순위검색
출처
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