주니어 데이터 엔지니어 우솨's 개발일지

코딩 테스트(Python) 2021 KAKAO BLIND RECRUITMENT 순위 검색 본문

코딩 테스트

코딩 테스트(Python) 2021 KAKAO BLIND RECRUITMENT 순위 검색

우솨 2024. 12. 17. 02:19

문제 설명

[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]

카카오는 하반기 경력 개발자 공개채용을 진행 중에 있으며 현재 지원서 접수와 코딩테스트가 종료되었습니다. 이번 채용에서 지원자는 지원서 작성 시 아래와 같이 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
from itertools import combinations

def solution(info, query):
    # 데이터 딕셔너리 초기화: 키는 조건, 값은 점수 리스트
    data = defaultdict(list)
    answer = []  # 쿼리 결과를 저장할 리스트

    # 1. 정보 처리
    for inf in info:
        p = inf.split()  # 각 정보를 공백 기준으로 나누기
        parts = p[:4]  # 조건 부분 (언어, 직군, 경력, 소울푸드)
        score = int(p[-1])  # 점수는 마지막 부분

        keys = []  # 가능한 조건의 조합을 저장할 리스트

        # 2. 모든 조합에 대해 '-'로 대체한 키를 생성
        for i in range(5):  # 0개부터 4개까지 선택
            for comb in combinations(range(4), i):  # 4개의 조건 중 i개를 선택
                key = list(parts)  # 조건 리스트 복사
                for j in comb:  # 선택된 인덱스는 '-'
                    key[j] = '-'
                keys.append(key)  # 생성된 조건 추가

        # 3. 모든 가능한 조합에 대해 점수를 추가
        for k in keys:
            data[tuple(k)].append(score)  # 조건을 튜플로 변환하여 딕셔너리에 추가

    # 4. 각 조건에 대한 점수 리스트를 정렬
    for i in data:
        data[i].sort()

    # 5. 쿼리 처리
    for q in query:
        qq = q.replace('and', '').split()  # 'and' 제거하고 공백으로 분리
        q_parts = qq[:4]  # 조건 부분
        score = int(qq[-1])  # 점수는 마지막 부분

        # 6. 해당 조건에 맞는 점수 리스트 가져오기
        scores = data[tuple(q_parts)]

        # 7. 이진 탐색을 사용하여 조건에 맞는 점수 개수 찾기
        left, right = 0, len(scores)
        while left < right:
            mid = (left + right) // 2  # 중간값 계산

            # 점수가 작으면 오른쪽 부분 탐색
            if int(scores[mid]) < score:
                left = mid + 1
            else:  # 점수가 크거나 같으면 왼쪽 부분 탐색
                right = mid

        # 조건에 맞는 점수 개수를 계산
        answer.append(len(scores) - left)

    return answer  # 쿼리 결과 반환