https://programmers.co.kr/learn/courses/30/lessons/72412
문제 설명이 길지만 잘 읽어보면 문제 이해에는 크게 어렵지 않다.
처음 문제를 풀때 딕셔너리로 해당 조합들을 만들었지만, "-"의 존재때문에 다시 생각하게 만들었다.
어떤 유저 정보에 대해서 -를 포함하는 딕셔너리도 만들어 주어야 하는데, 4가지를 판별하기 때문에 2^4를 해서 총 16가지의 딕셔너리의 키값의 경우의 수가 생기게 된다.
조합을 만드는 방법은 dfs를 사용했고, 모든 경우의 수를 딕셔너리에 넣어 주었다.
또한 query의 배열의 크기가 100000까지 가능하기 때문에 정렬된 숫자에서 하한선을 빨리 찾는 이진탐색을 사용하여 탐색하여야 했다.
마지막으로, 매칭이 되는 유저가 없다면 0을 넣어주는 예외처리도 해주어야 한다.
import bisect
combi = []
def makecombi(cnt,word,array):
if cnt == 4:
combi.append(word)
return
makecombi(cnt + 1, word+array[cnt], array)
makecombi(cnt + 1, word+'-',array)
def solution(info, query):
answer = []
info_dict = {}
for i in info:
a,b,c,d,e = i.split(" ")
makecombi(0,'',[a,b,c,d])
for com in combi:
if com in info_dict:
info_dict[com].append(int(e))
else:
info_dict[com] = [int(e)]
del combi[:]
for k in info_dict:
info_dict[k].sort()
for q in query:
tmp = ''
a,b,c,d = q.split(" and ")
d,e = d.split(" ")
tmp += a
tmp += b
tmp += c
tmp += d
e = int(e)
if tmp not in info_dict:
answer.append(0)
continue
pos = bisect.bisect_left(info_dict[tmp],e)
answer.append((len(info_dict[tmp]) - pos))
return answer