[Python] [Programmers] 순위 검색(72412)

긍정왕·2021년 6월 29일
2

Algorithm

목록 보기
36/69
post-thumbnail

💡 문제 해결

  1. 각 분류별 항목에 값을 tagging 해줌
  2. 지원자들을 탐색하며 해당 지원자가 포함될 수 있는 모든 경우의 수를 tagging한 값의 나열을 통해 all_case에 추가
  3. 경우의 수에 포함되는 인원의 코딩테스트 점수 값을 저장한 value 리스트를 오름차순으로 정렬
  4. 쿼리문을 탐색하며 포함되는 인원 중 코딩테스트 점수를 넘는 인원을 이분탐색하여 answer리스트에 해당 인원을 추가
  5. 통과되는 인원이 없다면 0을 추가
  6. 모든 쿼리문 실행이 끝난 후 answer리스트를 출력

📌 이분탐색은 구현도 좋지만 bisect 모듈을 통해 계산
📌 제한사항의 크기가 말도 안되게 크기 때문에 지원자와 쿼리문의 순회를 통한 이중 for문은 불가능할 것으로 예상



🧾 문제 설명

카카오는 하반기 경력 개발자 공개채용을 진행 중에 있으며 현재 지원서 접수와 코딩테스트가 종료되었습니다. 
이번 채용에서 지원자는 지원서 작성 시 아래와 같이 4가지 항목을 반드시 선택하도록 하였습니다.

- 코딩테스트 참여 개발언어 항목에 cpp, java, python 중 하나를 선택해야 합니다.
- 지원 직군 항목에 backend와 frontend 중 하나를 선택해야 합니다.
- 지원 경력구분 항목에 junior와 senior 중 하나를 선택해야 합니다.
- 선호하는 소울푸드로 chicken과 pizza 중 하나를 선택해야 합니다.
인재영입팀에 근무하고 있는 니니즈는 코딩테스트 결과를 분석하여 채용에 참여한 개발팀들에 제공하기 위해 
지원자들의 지원 조건을 선택하면 해당 조건에 맞는 지원자가 몇 명인 지 쉽게 알 수 있는 도구를 만들고 있습니다.
예를 들어, 개발팀에서 궁금해하는 문의사항은 다음과 같은 형태가 될 수 있습니다.
코딩테스트에 java로 참여했으며, backend 직군을 선택했고, junior 경력이면서, 소울푸드로 pizza를 선택한 사람 중 코딩테스트 점수를 50점 이상 받은 지원자는 몇 명인가?

물론 이 외에도 각 개발팀의 상황에 따라 아래와 같이 다양한 형태의 문의가 있을 수 있습니다.

코딩테스트에 python으로 참여했으며, frontend 직군을 선택했고, senior 경력이면서, 소울푸드로 chicken을 선택한 사람 중 코딩테스트 점수를 100점 이상 받은 사람은 모두 몇 명인가?
코딩테스트에 cpp로 참여했으며, senior 경력이면서, 소울푸드로 pizza를 선택한 사람 중 코딩테스트 점수를 100점 이상 받은 사람은 모두 몇 명인가?
backend 직군을 선택했고, senior 경력이면서 코딩테스트 점수를 200점 이상 받은 사람은 모두 몇 명인가?
소울푸드로 chicken을 선택한 사람 중 코딩테스트 점수를 250점 이상 받은 사람은 모두 몇 명인가?
코딩테스트 점수를 150점 이상 받은 사람은 모두 몇 명인가?
즉, 개발팀에서 궁금해하는 내용은 다음과 같은 형태를 갖습니다.

* [조건]을 만족하는 사람 중 코딩테스트 점수를 X점 이상 받은 사람은 모두 몇 명인가?

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

문제보기



🖨 입출력



📝 풀이

from collections import defaultdict
import bisect

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

    case_nums = {
        '-': 0,
        'cpp': 1,
        'java': 2,
        'python': 3,
        'backend': 1,
        'frontend': 2,
        'junior': 1,
        'senior': 2,
        'chicken': 1,
        'pizza': 2,
    }

    all_case = defaultdict(list)
    for applicant in info:
        language, task, career, food, score = map(str, applicant.split())
        
        for l_n in [0, case_nums[language]]:
            for t_n in [0, case_nums[task]]:
                for c_n in [0, case_nums[career]]:
                    for f_n in [0, case_nums[food]]:
                        key_num = str(l_n) + str(t_n) + str(c_n) + str(f_n)
                        all_case[key_num].append(int(score))

    for case in all_case.keys():
        all_case[case].sort()
    
    for requirements in query:
        requirement = list(map(str, requirements.split()))
        
        score_list = all_case.get(str(case_nums[requirement[0]]) + str(case_nums[requirement[2]]) + str(case_nums[requirement[4]]) + str(case_nums[requirement[6]]))
        required_score = int(requirement[7])
        if score_list:
            answer.append(len(score_list) - bisect.bisect_left(score_list, required_score))
        else:
            answer.append(0)

    return answer

profile
Impossible + 땀 한방울 == I'm possible

0개의 댓글