Better Code, Better Life

베스트앨범 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

베스트앨범 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 7. 22. 17:00

문제 풀이

1. 일단 많이 재생된 장르 순으로 정렬해야 합니다.

이 때, 해쉬 자료구조인 dict를 이용해서 시간복잡도를 줄입니다.

genres, plays 두개의 리스트를 한번에 순환하기 위해 zip으로 묶어줍니다.

여기서 다양한 리스트 정렬 방법들을 익힐 수 있습니다.

2. 그러고 많이 재생된 장르 순서로, 장르별 탑2곡의 index를 뽑아냅니다.

이 때 두 번째 indexing 방법을 고민해봐야 합니다.

클린 코드 작성법

  1. 여러번의 단계를 거쳐 문제가 해결됩니다. 단계마다 함수(모듈)을 이용해 복잡성을 줄이면 좋습니다.
    첫번째 단계는 get_sorted_genres_by_popularity으로 해결이 됐다면 더 이상 생각하지 않아도 됩니다.
  2. 변수를 선언 할 때, 그 변수의 사용 지점과 최대한 가까이에서 코드를 작성하면 좋습니다. 그래야 읽는 사람의 부담을 덜어줍니다.
    읽는 사람은 변수의 사용이 끝나기 전까지 머리 속에 남겨두어야 하기 때문에, 변수의 생성부터 소멸까지 코드가 많다면 부담이 갑니다.
  3. for문, if문의 중첩이 깊어진다면 내부의 로직을 함수로 만들어 가독성을 높입니다.
    get_unique_index 함수를 통해 if 문 중첩을 줄일 수 있었고 index에 대한 처리를 추상화할 수 있었습니다.

해답 코드

from collections import Counter

def get_sorted_genres_by_popularity(genres, plays):
    zipped = list(zip(genres, plays))
    zipped.sort(reverse=True)
    genre_play_dict = {}
    for genre, play in zipped:
        if genre not in genre_play_dict:
            genre_play_dict[genre] = 0
        genre_play_dict[genre] += play
    genres_rank = sorted(genre_play_dict, key=genre_play_dict.get, reverse=True)
    zipped.sort(key=lambda x: genres_rank.index(x[0]))
    return zipped

def get_unique_index(original, genre, play, answer):
    index = original.index((genre, play))
    if index in answer:
        next_part = original[index+1:]
        index = index + 1 + next_part.index((genre, play))
    return index

def solution(genres, plays):
    sorted_genres = get_sorted_genres_by_popularity(genres, plays)

    # (많이 재생된 장르 순서로) 장르별 탑2곡의 index를 뽑아낸다. 
    genre_counter = Counter()
    answer = []
    original = list(zip(genres, plays))
    for genre, play in sorted_genres:
        if genre_counter[genre] < 2:
            genre_counter[genre] += 1
            index = get_unique_index(original, genre, play, answer)
            answer.append(index)
    return answer

 

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

알고리즘 연습 - 베스트앨범 | 프로그래머스

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 play

programmers.co.kr

 

Comments