-
[Python] Programmers 순위 검색알고리즘/문제풀이 2021. 7. 17. 21:23728x90
1. 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/72412
2. 문제 요약
- query 조건에 맞는 지원자 찾기
- 총 4가지 항목 + 점수 조건
⇒ 쉬워 보이지만... 문제에 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 적혀있다.
3. 아이디어 정리
아이디어 1. 쿼리를 하나씩 돌리면서 조건에 맞는 사람 count
- 정확성을 맞지만, 효율성에서는 통과 못한다.
아이디어 2.카카오 문제 해설 참고 아이디어
2021 카카오 신입 공채 1차 온라인 코딩 테스트 for Tech developers 문제 해설
- 지원자가 가질 수 있는 case를 dict 리스트에 점수를 넣어준다. ⇒ 한 지원자 당 16가지의 조합이 나온다.
- ex) java backend junior pizza 150 인 지원자의 경우 아래 표와 같이 생성이 된다.
- dict 리스트에 아래와 같이 저장해준다. key는 지원자 정보 조합, value는 해당 지원자 점수 넣기
- dict에 있는 리스트 점수를 이분 탐색해서 구하기 위해 sorting를 해준다.
- 쿼리 하나씩 돌리며 해당 조건에 있는 dict 찾아 점수는 이분 탐색으로 몇 명이 조건에 맞는지 결과를 저장한다.
4. 문제 풀이
4-1. 내 풀이
""" 참고: https://tech.kakao.com/2021/01/25/2021-kakao-recruitment-round-1 """ from bisect import bisect_left from itertools import combinations from collections import defaultdict def get_combinations(people): """ 한 사람당 16가지 조합 만들기 - 4가지 항목에 대한 o, - 케이스 생성 """ cases = [] # 0,1,2,3 개 선택하면서 - 해당 조합에 -넣기 for k in range(5): for li in combinations([0, 1, 2, 3], k): case = '' for idx in range(4): if idx not in li: case += people[idx] else: case += '-' cases.append(case) return cases def solution(info, query): answer = list() all_info = defaultdict(list) # 1. info에 대한 정보에서 모든 케이스를 만들어준다 => 총 16가지 종류 for i in info: i = i.split() case = get_combinations(i) for c in case: all_info[c].append(int(i[-1])) # 2. dict에 있는 리스트 점수를 이분 탐색해서 구하기 위해 sorting for k in all_info.keys(): all_info[k].sort() # 3. 쿼리 하나씩 돌려 해당 조건에 있는 dict를 찾아 이분탐색으로 점수에 맞는 사람 찾기 for q in query: q = q.replace("and","").split() score = int(q.pop()) q = "".join(q) print(bisect_left(all_info[q], score)) # bisect_left: score 위치 반환. 전체 길이 - 위치 = score이상의 사람 수 answer.append(len(all_info[q]) - bisect_left(all_info[q], score)) return answer
5. 결론
- dict로 모든 결과를 넣어서 이분탐색으로 찾는 문제이다.
- 너무 어려운 문제...😿
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] 백준 16236 아기 상어 (0) 2021.07.24 [Python] 백준 15961, 2531 회전 초밥 (0) 2021.07.17 [Python] Programmers 광고 삽입 (0) 2021.07.17 [Python] 백준 2206 벽 부수고 이동하기 (0) 2021.07.17 [Python] 백준 3151 합이 0 (1) 2021.07.17