Algorithm/Python

[파이썬/프로그래머스]순위검색

박한결 2021. 5. 10. 11:15

링크> 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

문제>

지원자가 지원서에 입력한 4가지의 정보와 획득한 코딩테스트 점수를 하나의 문자열로 구성한 값의 배열 info, 개발팀이 궁금해하는 문의조건이 문자열 형태로 담긴 배열 query가 매개변수로 주어질 때,
각 문의조건에 해당하는 사람들의 숫자를 순서대로 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

 

풀이>

문제 자체는 어렵지 않지만, 효율성에서 걸리기 쉬운 문제다. 하지만 의외로 해결책은 간단하다. for 반복문을 돌면서 일일이 n점 이상인 응시자를 찾지 말고, 일단 정렬을 한다음에 이진탐색을 하면 쉽게 통과된다.

응시자가 속할 수 있는 16개의 그룹을 어떻게 구할까 처음에는 많이 고민했는데, combinations 로 하나 내가 직접 입력하나 그게 그거일거같아서 직접 16개의 케이스를 만들어줬다. 이 부분을 수정하면 코드가 더 예뻐질 거같긴 하다.

 

코드>

from collections import defaultdict
from bisect import bisect_left


def solution(info, query):
    answer = []
    group = defaultdict(list)

    for i in info:
        i = i.split()
        score = int(i.pop())
        group['----'].append(score)
        group[''.join(i)].append(score)
        cases = [['-', '', '-', '-'], ['-', '-', '-', ''], ['', '-', '-', '-'], ['-', '-', '', '-'], ['', '-', '', '-'],
                 ['', '', '-', '-'], ['', '-', '-', ''], ['-', '-', '', ''], ['-', '', '-', ''], ['-', '', '', '-'],
                 ['', '-', '', ''], ['-', '', '', ''], ['', '', '', '-'], ['', '', '-', '']]
        for case in cases:
            for j in range(4):
                if not case[j]:
                    case[j] = i[j]
            group[''.join(case)].append(score)
    for key in group:
        group[key] = sorted(group[key])

    for q in query:
        q = q.split(' and ')
        food, score = q.pop().split()
        q.append(food)
        score = int(score)
        q = ''.join(q)

        if q in group.keys():
            answer.append(len(group[q])-bisect_left(group[q], score))
        else:
            answer.append(0)
            
    return answer