반응형

programmers.co.kr/learn/courses/30/lessons/72412

 

코딩테스트 연습 - 순위 검색

["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"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

from itertools import combinations
from collections import defaultdict
from bisect import insort, bisect_left

def solution(info, query):
    answer = []
    allCases = defaultdict(list) # {info에 따라 구성될 수 있는 query 조합 : [점수]}

    for i in info:
        i = i.split()
        for j in range(1, 5):
            for comb in combinations(i[:-1], j): # 점수를 제외한 항목들의 모든 부분집합
                insort(allCases[''.join(comb)], int(i[-1])) # 정렬된 상태로 점수 추가
        insort(allCases[''], int(i[-1])) # 모든 항목이 상관 없을 경우 key를 ''으로 하여 점수 추가
    
    for q in query: 
        q = q.replace('and', '').replace('-', '').split() # 문자열 처리
        idx = bisect_left(allCases[''.join(q[:-1])], int(q[-1])) # 현재 query의 점수 위치 index
        
        # 해당 조건(key)에 맞는 value 개수 - 현재 점수가 들어갈 수 있는 index = 현재 점수 보다 높은 점수 개수 
        answer.append(len(allCases[''.join(q[:-1])]) - idx)  
        
    return answer

→ Level 2 문제여서 효율성이 있는지 확인도 안하고 greedy하게 풀었다가 크게 돌아갔다.

이게 왜 Level 2...

 

처음 통과한 코드는 insort 대신 query 탐색 이전에 모든 allCases를 정렬해주고,

query 탐색 반복문에서 이분탐색 직접 구현했었다.

bisect 모듈을 한 번도 안써봤는데 공부할겸 찾아서 적용해보았음. 앞으로 자주 사용해야겠다.

반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

광고 삽입  (0) 2021.03.29
합승 택시 요금  (0) 2021.03.23
메뉴 리뉴얼  (0) 2021.03.08
신규 아이디 추천  (0) 2021.03.08
가사 검색  (0) 2021.03.01

+ Recent posts