프로그래머스|베스트앨범

README·2022년 12월 29일
0

파이썬 PS풀이

목록 보기
108/136

문제 설명

노래의 장르와 재생횟수를 입력받고 재생 횟수가 많은 장르부터 장르별로 재생 횟수가 높은 노래 2곡의 번호를 출력하는 문제입니다. 노래의 번호는 입력된 순서대로 지정되고 만약 재생 횟수가 같은 경우 번호가 낮은 곡이 우선순위를 가집니다.

작동 순서

  1. 노래의 장르와 재생 횟수를 입력받습니다.
  2. 장르별 재생 횟수, 장르별 최다 재생 곡, 장르별 재생 횟수 2위 곡 딕셔너리를 생성합니다.
  3. 장르별 재생 횟수에는 해당 장르의 재생 순서를 모두 더해줍니다.
  4. 노래별로 해당 장르의 1위 곡과 재생 횟수를 비교하고 1위 곡보다 재생 횟수가 많은 경우 현재 곡을 1위 곡으로 지정하고 기존 1위곡은 2위 곡으로 지정해줍니다.
  5. 만약 현재 곡의 재생 횟수가 1위보다는 적고 2위보다는 많은 경우 2위로 지정해주고 2위보다도 적은 경우 다음 곡으로 넘어갑니다.
  6. 3에서 5의 과정이 끝나면 장르를 재생 횟수가 많은 순서로 정렬합니다.
  7. 재생 횟수가 많은 장르부터 1위 곡과 2위 곡의 번호를 앨범에 넣어줍니다. 이때 2위 곡이 존재하지 않을 수도 있으니 2위곡이 존재하는지 확인 후 앨범에 삽입해줍니다.

소스코드

import operator


def solution(genres, plays):
    answer = []
    totalPlay = dict()
    genre1st = dict()
    genre2nd = dict()

    for genre, play, i in zip(genres, plays, range(len(genres))):
        if genre in totalPlay:
            totalPlay[genre] += play
        else:
            totalPlay[genre] = play

        if genre not in genre1st:
            genre1st[genre] = [play, i]
        else:
            if genre1st[genre][0] < play:
                genre2nd[genre], genre1st[genre] = genre1st[genre], [play, i]
            else:
                if genre not in genre2nd:
                    genre2nd[genre] = [play, i]
                else:
                    if genre2nd[genre][0] < play:
                        genre2nd[genre] = [play, i]

    for i in sorted(totalPlay.items(), key=operator.itemgetter(1), reverse=True):
        answer.append(genre1st[i[0]][1])
        if i[0] in genre2nd:
            answer.append(genre2nd[i[0]][1])
    return answer
profile
INTP 개발자 지망생

0개의 댓글