티스토리 뷰

💡 문제 해결 아이디어

  • 리스트의 정렬을 간단하게만 이해하면 된다!
    • 리스트는 기본적으로 오름차순(작은 숫자부터 차례대로)으로 정렬된다.
    • 리스트 안에 리스트들이 있다면, 첫번째 요소를 기준으로 먼저 정렬한다.
      첫번째 요소의 값이 같으면 두번째 요소를 기준으로 정렬한다. > 문제 조건 3번
      두번째 요소의 값이 같으면 세번째 요소..... 이후 동일하다!
  • 코드의 간결함을 위해 lambda와 list comprehension(이름만 어려움)을 사용한다!
  • 코드와 주석을 보면 이해가 쉬울 것이다!

for문과 list comprehension의 이해를 돕기 위한 간단한 예제.
sort의 key와 lambda 활용에 대한 예제.

💻 작성된 코드(기본ver.)

def solution(genres, plays):
    # 각 장르별로 노래 재생수와 인덱스를 담기 위한 dict
    music_dict = {}
    # for문을 돌면서
    for i in range(len(genres)):
        genre = genres[i]
        # 만약 해당 장르가 처음 나왔다면, dict에 추가해주고
        if genre not in music_dict:
            music_dict[genre] = []
        # 해당 장르에 [-플레이횟수, 인덱스]를 추가해준다!
        # 1. -를 붙이는 이유: 정렬이 기본적으로 작은 것부터 먼저 되기에.
        # 2. [-플레이횟수, 인덱스] 순서인 이유: 많이 재생된 노래를 먼저 수록하고,
        #    재생횟수가 같을 경우, 인덱스가 낮은 노래를 먼저 수록하기 위해서!
        music_dict[genre].append([-plays[i], i])
    

    # 정렬을 위한 임시 앨범
    album = []
    for genre, songs in music_dict.items():
        # 해당 장르의 노래들을 정렬. [-플레이횟수, 인덱스]로 구성되었기에
        # 플레이횟수가 클수록, 그리고 인덱스가 작을수록 앞으로 온다.
        songs.sort()
        album.append(songs)
    
    best_album = []
    # 문제 조건 1번, '속한 노래가 많이 재생된 장르를 먼저'를 만족시키기 위해,
    # 각 장르별 플레이횟수의 합으로 정렬
    album.sort(key= lambda genre: sum([cnt for cnt, idx in genre]))

    # 각 장르별로 앞의 2개만, 앨범에 추가한다.
    for genre in album:
        best_album.extend([index for play, index in genre[:2]])

    return best_album

 

💻 작성된 코드(겉멋ver.)

  • 등록되지 않은 key도 알잘딱 등록해주는 defaultdict 사용 (파이썬 기본 내장 함수)
  • sorted 함수와 list comprehension을 활용한 겉멋.
  • extend가 아니라 굳이 += 를 활용하는 겉멋. (리스트끼리 더하면 extend가 알아서 된다.)
from collections import defaultdict

def solution(genres, plays):
    # 각 장르별로 노래 재생수와 인덱스를 담기 위한 dict
    music_dict = defaultdict(list)
    for i in range(len(genres)):
        music_dict[genres[i]].append([-plays[i], i])
    

    # 정렬을 위한 임시 앨범
    album = [sorted(songs) for songs in music_dict.values()]
    album.sort(key= lambda genre: sum([cnt for cnt, idx in genre]))

    best_album = []
    # 각 장르별로 앞의 2개만, 앨범에 추가한다.
    for genre in album:
        best_album += [index for play, index in genre[:2]]

    return best_album
댓글