Altiora Petamus

베스트 앨범 본문

1day-1algorithm

베스트 앨범

Haril Song 2021. 6. 26. 17:24
 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

🤔생각해보기

먼저 문제의 조건을 살펴보자면,

  1. 속한 노래가 많이 재생된 장르를 먼저 수록 → 각각 장르의 재생 횟수를 정렬된 상태로 봐야 한다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록 → 특정 장르에서 어떤 노래가 많이 재생되었는지 알아야 한다.
  3. 고유번호가 낮은 노래를 먼저 수록 → 최초 정렬시 고유번호로 정렬하여 Stable sort 가 유지되도록 유도하기

어느 정도 방향성을 잡은 후엔, 사고를 단순하게 하기 위해 dictionary 를 두 개 선언해서 풀어보았다.

성공

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

    total_plays = {}
    data = {}
    # 1. 딕셔너리 만들어주기
    for g in range(len(genres)):
        total_plays[genres[g]] = total_plays.get(genres[g], 0) + plays[g]
        data[g] = (genres[g], plays[g])

    # 2. 많이 재생된 순서로 장르 정렬
    a = sorted(total_plays.items(), key=lambda x: -x[1])

    # 3. 장르 내에서 많이 재생된 노래
    for g, c in a:
        # 상위 두 개까지만 가져오기
        b = sorted(filter(lambda x: x[1][0] == g, data.items()), key=lambda x: -x[1][1])[:2]
        for number, info in b:
            answer.append(number)

    return answer

total_plays 에는 장르의 이름을 키값으로 하여 총 재생된 횟수만 저장된다.

data 에는 키값을 고유 번호로 하고, 값으로는 (장르 이름, 재생횟수)처럼 튜플 형태로 저장한다.

 

#2 에서는 딕셔너리를 정렬해주는데, sorted 를 사용하여 정렬할 경우, 리스트를 반환 받게되므로 따로 형변환이 필요없다. 그리고 옵션에 -(마이너스) 값을 주면 내림차순으로 정렬된다.

 

#3 에서도 필터링과 정렬을 하고 있다. 많이 재생된 장르가 a 에 순서대로 저장되어 있으므로 for문을 통해서 하나씩 해당 장르를 꺼낸 후 처리한다.

 

보다시피 lambda 의 활용이 거의 필수적인 문제다. lambda 를 적절하게 사용하면 훨씬 유연하게 다양한 상황에 대처할 수 있다.

 

코드 품질 향상을 위한 고민

튜플은 정렬시 첫번째 인자를 기준으로 정렬되므로 (재생횟수, 장르) 로 순서를 바꿔주면 과정을 좀 줄일 수 있겠다.

'1day-1algorithm' 카테고리의 다른 글

Tape Equilibrium  (0) 2021.07.01
소수 찾기  (0) 2021.06.29
단어 변환  (0) 2021.06.25
블랙잭  (0) 2021.06.23
통계학  (0) 2021.06.22