본문 바로가기
Algorithm

[프로그래머스] 해시 - 베스트앨범(파이썬 문제풀이)

by j-y 2021. 4. 2.
반응형

문제 링크

 

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

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

programmers.co.kr

 

딕셔너리 두 개를 사용해 문제를 풀어봤습니다.

  • genre_score : 각 장르별 속한 노래의 총 점수를 저장하는 딕셔너리
  • chk : 노래의 고유번호를 key 값으로 사용하고, value로 [해당 노래가 속한 장르의 점수, 해당 노래의 개별 점수]를 저장

이제 문제에 제시된 노래 수록 기준에 맞추어 정렬을 하고 추출을 하면 되겠습니다.

 

for문으로 두 딕셔너리의 값을 설정한 뒤 sorted를 이용해 딕셔너리를 정렬했습니다.

먼저 수록 기준 1번을 맞추기 위해 genre_score를 내림차순으로 정렬합니다.

그리고 2번과 3번 기준을 맞추기 위해 chk를 정렬하는데, sorted 안에서 람다식을 key=lambda x: (x[1], -x[0]), reverse=True 이렇게 설정하면 chk의 점수로 내림차순 정렬된 후 고유 번호로 오름차순 정렬됩니다. 이렇게 하면 2번 기준인 장르 내 많이 재생된 노래 순으로 1차적으로 정렬되고, 고유 번호 기준 오름차순 조건에 따라 같은 재생 횟수가 있는 경우 고유 번호가 낮은 노래가 앞으로 오게 됩니다.

 

마지막 for문을 돌며 순서대로 추출하면 되는데, 장르별 두 개씩 추출하라는 조건이 또 있었습니다. 해당 조건을 맞추기 위해 cnt 변수를 두어 각 장르별 추출된 횟수를 카운팅 하고, 안쪽 for문이 이미 탐색한 장르를 재탐색하는 일이 없도록 start 변수를 두어 안쪽 for문의 시작을 start 부터 진행되도록 코드를 작성했습니다!

 

문제 풀이(파이썬)


def solution(genres, plays):
    genre_score = dict()
    chk = dict()

    for i in range(len(genres)):
        genre_score[genres[i]] = genre_score.get(genres[i], 0) + plays[i]

    for i in range(len(genres)):
        chk[i] = [genre_score[genres[i]], plays[i]]

    chk = sorted(chk.items(), key=lambda x: (x[1], -x[0]), reverse=True)
    genre_score = sorted(genre_score.items(), key=lambda x:x[1], reverse=True)

    start = 0
    res = list()
    for gs in genre_score:
        cnt = 0
        for i in range(start, len(chk)):
            if chk[i][1][0] == gs[1] and cnt < 2:
                start += 1
                res.append(chk[i][0])
                cnt += 1

    return res
반응형

댓글