1from itertools import combinations
2from collections import defaultdict
3from bisect import bisect_left
4
5def solution(infos, queries):
6 answer = []
7 dataset = defaultdict(list)
8
9 for info in infos:
10 token = info.split(' ')
11
12 for j in range(5):
13 for case in list(combinations([0,1,2,3], j)):
14 temp = token[:-1]
15 for c in case:
16 temp[c] = '-'
17 dataset[''.join(temp)].append(int(token[-1]))
18 for value in dataset.values():
19 value.sort()
20
21 for query in queries:
22 query = query.replace(" and", "").split()
23 target_key = ''.join(query[:-1])
24 target_value = int(query[-1])
25 count = 0
26
27 if target_key in dataset:
28 target_list = dataset[target_key]
29 idx = bisect_left(target_list, target_value)
30 count = len(target_list)-idx
31
32 answer.append(count)
33 return answer
문제
-
지원자가 지원서에 작성한 4가지 정보와, 특정 지원자의 지원서 점수가 문자열 배열로 주어진다
-
개발언어는 cpp, java, python 중 하나, 지원 직군에는 backend, frontend 중 하나,
-
지원 경력에는 junior, senior 중 하나, 소울푸드에는 chicken, pizza 중 하나가 주어진다
-
개발팀이 궁금해하는 문의 조건도 문자열 배열로 주어진다
-
개발언어와 직군, 경력, 소울푸드 조건은 “and"로 구분되어 있다
-
‘-‘표시는 해당 조건을 고려하지 않는다는 뜻인데, 점수를 제외한 항목에 주어질 수 있다
-
문의조건에 해당하는 사람 중 코딩테스트 점수를 만족하는 사람의 수를 구하라
-
TC
- input
info:[“java backend junior pizza 150”,“python frontend senior chicken 210”,“python frontend senior chicken 150”,“cpp backend senior pizza 260”,“java backend junior chicken 80”,“python backend senior chicken 50”]
query:[“java and backend and junior and pizza 100”,“python and frontend and senior and chicken 200”,“cpp and - and senior and pizza 250”,"- and backend and senior and - 150”,"- and - and - and chicken 100","- and - and - and - 150"] - ouput
[1,1,1,1,2,4]
- input
해결방법
- 언어, 직군, 경력, 소울푸드를 한번에 거르기 위해 dictionary에 key를 만들어주어야한다
- 모든 경우를 고려해주기 위해 ‘-‘도 섞어가면서 해당 지원자를 찾을 수 있는 모든 쿼리를 구해서 key로 등록한다
- value에는 점수가 들어가는데 이후에 이분탐색을 하기위해 오름차순으로 정렬해준다
- bisect_left 함수를 통해 해당 점수 이상인 사람의 수를 구한다