정보를 사전에 저장하고 조건에 해당하는 사람들의 전체 수를 카운트하는 문제로 딕셔너리를 활용할 때 효율적으로 풀 수 있다. 풀이 시간을 줄이기 위해 이진탐색 함수, 정렬 함수 등 또한 사용했다. 주어진 공간이 넉넉할 때 비교문보다 미리 기록해 두는 과정을 통해 극적으로 시간 효율성이 증가할 수 있음을 실감했다.
from bisect import bisect_left
def solution (info, query):
people = {'cpp': [], 'java': [], 'python': [], 'backend': [], 'frontend': [], 'junior': [],
'senior': [], 'chicken': [], 'pizza': []}
scores = {}
for idx, person in enumerate(info):
person = person.split(' ')
for data in person[:-1]:
people[data] += [idx]
scores[idx] = int(person[-1])
new_scores = sorted(scores.values())
result = []
for qu in query:
qu = qu.split(' ')
while 'and' in qu:
qu.remove('and')
while '-' in qu:
qu.remove('-')
if len(qu) == 1:
idx = bisect_left(new_scores, int(qu[-1]))
total = len(new_scores) - idx
result.append(total)
else:
member = set(people.get(qu[0]))
for question in qu[1:-1]:
member = member & set(people.get(question))
total = 0
for idx in member:
if scores.get(idx) >= int(qu[-1]): total += 1
result.append(total)
return result
from bisect import bisect_left
from itertools import combinations
def solution(info, query):
infos = {}
scores = []
for person in info:
person = person.split(' ')
score = int(person[-1])
person = person[:-1]
scores.append(score)
for i in range(1, 5):
combis = list(combinations(person, i))
for comb in combis:
comb = ' '.join(comb)
if not infos.get(comb):
infos[comb] = [score]
else:
infos[comb].append(score)
scores.sort()
result = []
for qu in query:
qu = qu.split(' ')
while 'and' in qu:
qu.remove('and')
while '-' in qu:
qu.remove('-')
question = ' '.join(qu[:-1])
score = int(qu[-1])
if not question:
idx = bisect_left(scores, score)
result.append(len(scores)-idx)
elif infos.get(question):
people = infos.get(question)
people.sort()
idx = bisect_left(people, score)
result.append(len(people)-idx)
else:
result.append(0)
return result