본문 바로가기
코딩 테스트

[Python] 코딩테스트 고득점Kit | 해시4-베스트앨범 (dict정렬)

by 카프리썬 2021. 7. 31.
728x90

아래의 문제는 프로그래머스 코딩테스트 고득점 Kit 내용이며 코드는 직접 푼 내용입니다.


베스트앨범

문제상황

 

요구사항

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

 

한사항

  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.

입출력


풀이과정

dict를 두개만들었다.

하나는 장르에 따라서 (고유번호, 재생횟수)를 가지고 있는 dict (index)

하나는 장르를 key로 재생횟수를 합한 dict (score)

 

그리고 정렬을 두번하면 된다.

처음엔 재생횟수를 기준으로, 다음엔 재생횟수가 많은 장르의 (고유번호,재생횟수)의 재생횟수를 기준으로 

 

결과

def solution(genres, plays):
    answer = []

    index = {}
    score = {}

    for i, (genre, play) in enumerate(zip(genres, plays)):
        if genre not in index:
            index[genre] = [(i, play)]
        else:
            index[genre].append((i, play))

        if genre not in score:
            score[genre] = play
        else:
            score[genre] += play
    #print(index) #{'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]}
    #print(score) #{'classic': 1450, 'pop': 3100}
    
    for (k, v) in sorted(score.items(), key=lambda x:x[1], reverse=True):
        for (i, play) in sorted(index[k], key=lambda x:x[1], reverse=True)[:2]:
            answer.append(i)
    return answer
    
genres=["classic", "pop", "classic", "classic", "pop"]
plays=[500, 600, 150, 800, 2500]
print(solution(genres, plays))

배운점

반응형