본문 바로가기
Problem Solving/카카오 코딩테스트

[카카오 기출] 순위 검색

by ggyongi 2021. 9. 2.
반응형

https://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

import collections
import re
import bisect
def solution(info, query):
    
    dct = collections.defaultdict(list)
    
    for i in range(len(info)):
        temp = info[i].split()
  
        key = ''.join(temp[:4])
        dct[key].append(int(temp[4]))
        
    for key in dct.keys(): 
        dct[key] = sorted(dct[key])  
    
    answer = []
    
    def dfs(i, key):
        global count
        if i == 4:
            idx = bisect.bisect_left(dct[key], int(q[4]))
            count += len(dct[key]) - idx      
        
        if i == 3:
            if q[3] == '-':
                dfs(i+1, key + 'chicken')
                dfs(i+1, key + 'pizza')
            else:
                dfs(i+1, key + q[3])
                
        elif i == 2:
            if q[2] == '-':
                dfs(i+1, key + 'junior')
                dfs(i+1, key + 'senior')
            else:
                dfs(i+1, key + q[2])
                
        elif i == 1:
            if q[1] == '-':
                dfs(i+1, key + 'backend')
                dfs(i+1, key + 'frontend')
            else:
                dfs(i+1, key + q[1])
                
        elif i == 0:
            if q[0] == '-':
                dfs(i+1, key + 'cpp')
                dfs(i+1, key + 'java')
                dfs(i+1, key + 'python')
            else:
                dfs(i+1, key + q[0])
                        
    
    for i in range(len(query)):
        q = query[i]
        q = re.sub('and','',q).split()
        global count
        count = 0
        dfs(0, "")        
        answer.append(count)

    return answer

 

처음에 시간 초과가 발생했던 부분은 재귀함수 내에서 i==4인 점에 도달했을 때 

이진 탐색을 이용하지 않고 완전 탐색으로 count를 했을 시 발생했다.

정렬된 리스트에서 무언갈 찾을 땐 꼭 이진 탐색을 기억하자.

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글