순위 검색

210723

'''
https://programmers.co.kr/learn/courses/30/lessons/72412
순위 검색
[풀이]
1. dictionary 고급 문제
2. bisect 사용
'''
from itertools import product
from bisect import bisect_left as bisl

def solution(info, query):
    dic = {}
    for words in info:
        words = words.split()
        words, score = words[:-1], int(words[-1])
        for word in product(*zip(words, '-' * 4)):
            key = ''.join(word)
            dic.setdefault(key, [])
            dic[''.join(word)].append(score)

    for key in dic.keys():
        dic[key].sort()

    answer = []
    for q in query:
        q = q.replace('and ', '').split()
        q, score = ''.join(q[:-1]), int(q[-1])
        arr = dic.get(q)
        if arr == None:
            answer.append(0)
        else:
            answer.append(len(arr) - bisl(arr, score))

    return answer
'''
이건 미친 문제이다. 설마 이거야? 했던 풀이방법으로 풀어야 되는 문제.
정답률이 5%에 안되는 문제인데 level02 에 존재하면 안된다.
실제 시험볼 때도 못풀었다 ㅠ 지금도 못풀어서 카카오 공식 풀이 보다가
dictionary로 풀으라길래 푼 문제..

미친 풀이가 있는데, 각 매칭을 비트 연산자 방식으로 생각한 것이 독특하다.
심지어 코드도 간결

from functools import reduce
from collections import defaultdict
from bisect import insort, bisect_left

def solution(info, query):
    table = {"c": 3, "j": 5, "p": 6, "b": 6, "f": 5, "s": 6, "-": 0}
    conv = lambda l, t: (reduce(lambda a, k: (a << 3) + t(table[k[0]]), l[:-1], 0), int(l[-1]))
    info = list(map(lambda s: conv(s.split(" "), lambda x: 7 - x), info))
    query = list(map(lambda s: conv([c for c in s.split(" ") if c != "and"], lambda x: x), query))
    d = defaultdict(list)
    for k, v in info:
        insort(d[k], v)
    return [sum([len(l) - bisect_left(l, v) for k, l in d.items() if not k & q]) for q, v in query]
'''

Last updated

Was this helpful?