[프로그래머스] 순위 검색

최동혁·2023년 1월 4일
0

프로그래머스

목록 보기
66/68

풀이 방법

"-" 이거 때문에 모든 경우의 수를 전부 생각해야한다.

위의 그림처럼 모든 경우의 수를 생각하면 16가지가 나온다.
이 16가지를 하나의 dict에 넣어준다.
key값은 언어, 직군, 경력, 소울푸드의 str을 전부 하나의 문자열로 합쳐서 넣어준다.
value는 defaultdict(list)를 이용해 list 타입으로 전부 초기화 해주고 append 해준다.
그 후, list에 쌓여있는 숫자들을 전부 정렬해준다.

queries를 순회하며, 특정 점수 이상의 숫자를 찾을 때 이분탐색 알고리즘을 이용하여 찾는다.

풀이 코드

from itertools import combinations
from collections import defaultdict
def solution(information, queries):
    answer = []
    dic = defaultdict(list)
    
    for info in information:
        info = info.split()
        condition = info[:-1]  
        score = int(info[-1])
        
        for i in range(5):
            case = list(combinations([0,1,2,3], i))
            for c in case:
                tmp = condition.copy()
                for idx in c:
                    tmp[idx] = "-"
                key = ''.join(tmp)
                dic[key].append(score) 
    for k in dic.keys():
        dic[k].sort()
         
    for q in queries:
        q = q.split(" and ")
        condition = ''.join(q[:-1]) + q[-1].split()[0]
        score = int(q[-1].split()[-1])
        if not len(dic[condition]):
            answer.append(0)
        else:
            start, end = 0, len(dic[condition]) - 1
            while start <= end:
                mid = (start + end) // 2
                if dic[condition][mid] >= score:
                    end = mid - 1
                else:
                    start = mid + 1
            answer.append(len(dic[condition]) - start)     
    return answer
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글