[ PS / PYTHON ] 42579. 베스트 앨범

박제현·2024년 2월 1일
0

코딩테스트

목록 보기
17/101

풀이.

해쉬 문제이다.
해쉬 맵을 사용해서 풀어야 한다고 생각을 하고, 문제를 해석했다.
우선 장르와 플레이된 횟수를 인자로 받으니, 둘을 서로 묶어야 겠다고 생각했다. -> 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))

가장 처음 만든 mapranks 다.
ranks를 아이템 기준으로 정렬하기 위해서 sorted 함수를 사용하고, 키 값으로 각 튜플의 두번째 값의 합을 사용한다.

코드를 해석하면 key = lambda xxsum(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

profile
닷넷 새싹

0개의 댓글