새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[프로그래머스] 베스트앨범

by 언호 2022. 5. 4.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 접근 및 이해

주어진 장르와 노래를 함께 반복시켜, 장르별로 노래를 모으고 총 재생시간을 기록하였습니다.

이후 장르별로 총 재생기간을 비교하여 가장 많이 재생된 장르순서대로 정렬하였습니다.

마지막으로 장르별로 가장 많이 재생된 노래를 2개씩 꺼내서 정답에 추가하였습니다.

2) 알고리즘

  • 구현

3) 풀이 코드

사용 언어 - Python

def solution(genres, plays):
    genre_dict = {}                                                     # 장르별 플레이 리스트, 장르: {플레이리스트, 총 플레이 시간}
    genre_plays = []                                                    # 장르별 총 플레이 시간
    answer = []                                                         # 정답 리스트

    for idx in range(len(genres)):                                      # 입력으로 주어지는 모든 장르들 반복
        genre = genres[idx]
        play = plays[idx]

        if not genre_dict.get(genre, False):                            # 아직 나온적 없는 장르라면, 딕셔너리에 키값과 기본 값 추가
            genre_dict[genre] = {'plays': [], 'total_play': 0}

        genre_dict[genre]['plays'].append((play, idx))                  # 현재 노래 플레이 시간, 고유 번호
        genre_dict[genre]['total_play'] += play                         # 현재 노래 플레이 시간을 총 플레이 시간에 추가

    for k, v in genre_dict.items():                                     # 장르별로 반복하며
        genre_plays.append((k, v['total_play']))                        # (장르, 총 플레이시간) 형태로 리스트에 추가
    
    genre_plays.sort(key=lambda x: x[1], reverse=True)                  # 총 플레이시간을 기준으로 내림차순 정렬

    for genre, _ in genre_plays:
        play = sorted(genre_dict[genre]['plays'], key=lambda x: x[1], reverse=True)     # 노래 고유번호 기준으로 내림 차순
        play = sorted(play, key=lambda x: x[0])                                         # 노래 플레이 시간 기준으로 오름 차순
                                                                                        # 가장 많이 플레이 노래 오름차순으로 정렬되고, 고유번호 기준으로 내림차순 정렬됨
        idx = 2                             # 한 장르에 최대 2개 모음
        while idx > 0 and play:             # 두개 아직 안넣었거나, 넣을 노래가 있을때 반복
            answer.append(play.pop()[1])    # 위에서 정렬한 노래를 가장 뒤에서부터 꺼내와서 정답에 저장
            idx -= 1

    return answer

🔗 문제 링크

- https://programmers.co.kr/learn/courses/30/lessons/42579

 

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

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

programmers.co.kr

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

댓글