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
를 통해 효율성 문제를 해결할 수 있었다.