해쉬 문제이다.
해쉬 맵을 사용해서 풀어야 한다고 생각을 하고, 문제를 해석했다.
우선 장르와 플레이된 횟수를 인자로 받으니, 둘을 서로 묶어야 겠다고 생각했다. -> zip 함수 사용.
그리고 zip 된 데이터가 즉 (genre, play) 가 순서대로 고유번호를 가지니 index 를 지정해줄 필요가 있다.
이걸 해쉬 맵으로 구성해보자.
{
'classic' : [(0, 500), (2, 150), (3, 800)]
'pop' : [(1, 600), (4, 2500)]
}
이런 구조로 만들어주었다.
여기서 각 키 값에 대응하는 아이템들의 플레이 횟수의 합을 기준으로 맵을 내림차순 정렬한다.
{
'pop' : [(1, 600), (4, 2500)]
'classic' : [(0, 500), (2, 150), (3, 800)]
}
이런 형태가 될 수 있게..
그리고 각 장르마다도 플레이 된 횟수를 기준으로 내림차순 정렬
{
'pop' : [(4, 2500), (1, 600)]
'classic' : [(3, 800), (0, 500), (2, 150)]
}
그러면 결과적으로 이렇게 맵이 정렬된다.
여기서 같은 장르가 2개 이상 안나오도록 고유 번호를 answer 배열에 넣어주면 끝이다.
이렇게 생각은 간단하게 구상이 되었는데, 이를 구현하기에 꽤나 애를 먹었다.
각 키 값에 대응하는 아이템들의 플레이 횟수의 합을 기준으로 정렬하는 것이 꽤나 많이 까다로웠다.
sorted_ranks = dict(sorted(ranks.items(), key=lambda x: sum(y[1] for y in x[1]), reverse= True))
가장 처음 만든 map
이 ranks
다.
ranks
를 아이템 기준으로 정렬하기 위해서 sorted
함수를 사용하고, 키 값으로 각 튜플의 두번째 값의 합을 사용한다.
코드를 해석하면 key = lambda x
의 x
는 sum(y[1] for y in x[1])
이 되는 것이고,
x
는 '(pop', [(1, 600), (4, 2500)])
이다.
여기서 우리가 필요한 것이 x[1]
인 튜플 값들이다.
이 튜플 값들의 플레이 횟수 즉 두번째 인자의 합을 구하기 위해서 람다 함수 내부에 반복문을 작성한다.
sum(y[1] for y in x[1])
부분.
여기서 y
는 (1, 600)
이고, y[1]
은 말 안해도 알 것이라 생각한다.
이렇게 하면 우리가 원하는 기준인 장르별 총 플레이 횟수를 키값으로 사용할 수 있다.
def solution(genres, plays):
answer = []
ranks = {}
index = 0
for (genre, play) in zip(genres, plays):
if ranks.get(genre):
ranks[genre].append((index, play))
else:
ranks[genre] = [(index, play)]
index += 1
for genre in set(genres):
ranks[genre].sort(key=lambda x:x[1], reverse=True)
sorted_ranks = dict(sorted(ranks.items(), key=lambda x: sum(y[1] for y in x[1]), reverse= True))
for genre in list(sorted_ranks.keys()):
count = 0
while count < 2 and count < len(ranks[genre]):
answer.append(ranks[genre][count][0])
count += 1
return answer