[2021 카카오 블라인드 테스트] 순위 검색

minjyo·2021년 10월 4일
0

알고리즘 풀이

목록 보기
6/7

문제

풀이

각 지원자의 info가 가지고 있는 4가지의 조건으로 만들 수 있는 경우의 수는 16가지다. 예) 언어: java냐 아니냐, 직군: frontend냐 아니냐 ... -> 2 x 2 x 2 x 2 = 16
이 경우의 수들을 딕셔너리의 키 값으로 저장하고, 그 키 값에 대한 value에 해당 지원자의 점수를 모두 추가한다.
query에서 고려하지 않아도 되는 조건인 -은 삭제하여, 탐색하려는 키 값을 만들어 탐색한다.

from itertools import combinations

def lowerBound(data, target): # 찾고자 하는 값보다 크거나 같은 원소가 처음 나오는 인덱스
    start = 0
    end = len(data) - 1
    mid = (start + end) // 2
    
    while start < end:
        if target <= data[mid]:
            end = mid
        else:
            start = mid + 1
        mid = (start + end) // 2
            
    return start

def solution(info, query):
    answer = []
    
    apply = {} # key: (언어)+(직군)+(경력)+(소울푸드), value: [해당 조건을 만족하는 지원자의 점수]
    for i in info:
        s = i.split()
        tags = s[:-1]

        for i in range(5): # 조건 4개 중에서 0~4개 선택하는 경우의 수 -> 16가지
            for comb in combinations(tags, i):
                tag = ''.join(comb) 
                if tag not in apply:
                    apply[tag] = []
                apply[tag].append(int(s[4])) 
    
    for key in apply.keys(): 
        apply[key] = sorted(apply[key]) # 그룹마다 점수로 지원자 정보 오름차순 정렬
    
    for q in query:
        arr = q.split()
        cond = ""
        for i, a in enumerate(arr):
            if i % 2 == 0 and a != '-':
                cond += arr[i]    
        
        if cond not in apply: # 딕셔너리에 키가 없다 == 원하는 조건의 지원자가 아무도 없었다.
            answer.append(0)
            continue
            
        k = lowerBound(apply[cond], int(arr[-1]))
        if apply[cond][k] < int(arr[-1]): # 조건은 맞지만 원하는 점수 이상인 지원자가 없는 경우
            answer.append(0)
        else:
            answer.append(len(apply[cond]) - k)

    return answer
profile
깊게 공부하는 개발자가 되기

0개의 댓글