[Programmers][Python]순위 검색

MEIN_FIGUR·2021년 8월 23일
0

https://programmers.co.kr/learn/courses/30/lessons/72412

📌풀이


내가 쓴 풀이(성공)

  • all_cases: 주어진 데이터를 활용해 만들 수 있는 모든 조합 리스트에 저장 후 리턴
    • 각각의 케이스가 -로 바뀐 경우를 고려
    • combinations를 활용해 조합 확인
    • 메모리의 크기를 줄이기 위해 각 데이터의 첫 글자만 활용
  • 각각의 데이터를 all_cases를 통해 변환하고, 그 모든 것을 저장하는 딕셔너리 p_c
    • all_cases로 변환한 것들을 key로, 점수를 value로 딕셔너리 구현
  • query를 활용할 때, 기준 점수 이상인 개수를 찾아야 하므로, 미리 value들을 정렬
  • query의 내용을 받아와서 딕셔너리의 key를 활용해 접근, bisect_left를 통해 전체 길이에서 빼야 할 인덱스 찾고 차를 구함
from collections import defaultdict
from itertools import combinations as com
from bisect import bisect_left

# 주어진 데이터를 활용해 모든 경우를 얻고, 저장해 리턴
# -로 표기되는 모든 경우 고려
# 메모리 크기를 줄이기 위해, 첫번째 글자만 활용
def all_cases(data):
    cases = []
    for i in range(5):
        for c in com(range(4), i) :
            tmp = ''
            for idx in range(4):
                if idx in c :
                    tmp += '-'
                else :
                    tmp += data[idx][0]
            cases.append(tmp)
    return cases


def solution(info, query):
    answer = []
    
    # 각각의 info를 읽은 모든 결과를 key로 받고, value에 점수를 저장
    p_c = defaultdict(list)
    for data in info :
        data = data.split()
        cases = all_cases(data[:4]) # 마지막 점수만 분리하고 연산
        for case in cases : # 각각의 경우를 key로 설정하고 점수 추가
            p_c[case].append(int(data[4])) 
    
    # 갯수를 세기 위해 미리 정렬을 함
    for value in p_c.values():
        value.sort()
    
    # 쿼리에서 불러온 정보를 통해 딕셔너리에 접근, 해당 점수보다 크거나 같은 경우 확인
    for q in query :
        q = q.split()
        now = q[0][0] + q[2][0] + q[4][0] + q[6][0]
        result = len(p_c[now]) - bisect_left(p_c[now], int(q[7]))
        answer.append(result)
        
        
    return answer



📌후기


다양한 모듈을 통해 해결할 수 있었던 문제였다! 예전에 풀 때는 효율성 문제를 해결하지 못했던 것이 생각이 나는데, 이진 탐색인 bisect를 통해 효율성 문제를 해결할 수 있었다.

profile
Growing Developer

0개의 댓글