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

출처: 프로그래머스 - 베스트앨범

문제

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다.
노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래의 장르를 나타내는 문자열 배열 genres와
노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때,
베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

제한사항

genres[i]는 고유번호가 i인 노래의 장르입니다.
plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
장르 종류는 100개 미만입니다.
장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
모든 장르는 재생된 횟수가 다릅니다.

입출력 예

genres: ["classic", "pop", "classic", "classic", "pop"]
plays: [500, 600, 150, 800, 2500]
return: [4, 1, 3, 0]

입출력 예 설명

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.
고유 번호 3: 800회 재생
고유 번호 0: 500회 재생
고유 번호 2: 150회 재생
pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.
고유 번호 4: 2,500회 재생
고유 번호 1: 600회 재생
따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.

내 풀이


def solution(genres, plays):
    awsdict = {}
    for i in range(len(genres)):
        if genres[i] not in awsdict.keys() : # 이미 key 안에 존재하는지 check
            awsdict[genres[i]] = plays[i]
        else :
            awsdict[genres[i]] += plays[i] # 이미 존재하는 장르이면 기존 값에 추가
    
    genrelist = sorted(awsdict.items(), key = lambda x : x[1], reverse = True) # 재생 순위로 정렬
    answerlist = []
    for j in range(len(genrelist)): # 많이 재생된 장르를 가진 index를 plays에서 검색
        genreidx = []
        for k in range(len(genres)):
            if genres[k] == genrelist[j][0]: # 특정 장르를 가진 index의 재생 횟수를 저장한다
                genreidx.append(plays[k])
        genreidx.sort(reverse=True) # 역순으로 정렬
        if len(genreidx) > 1 :
            answerlist.append(plays.index(genreidx[0])) # 특정 장르의 첫번째로 많이 재생된 목록의 idx 삽입
            answerlist.append(plays.index(genreidx[1])) # 특정 장르의 두번째로 많이 재생된 목록의 idx 삽입
        else :
            answerlist.append(plays.index(genreidx[0])) # 특정 장르의 첫번째로 많이 재생된 목록의 idx 삽입        
            
    return answerlist

Notation

코딩을 하기 전 전체적인 그림을 그릴 필요가 있다. 예시에만 집중하다보니 genreidx에 [1] 요소가 없을 수도 있다는 생각을 하지 못했다. 즉, 특정 장르의 경우 한곡만 있을 수 있고, 그럼 genreidx[1]이 존재하지않아 out of index error가 발생할 수 있다. 



추가 학습 내용

  • zip : 여러가지 요소를 하나로 묶어줌. ex) zip(genres, plays) -> 새로운 리스트
  • enumerate 함수 : 어떤 리스트의 index와 그 값을 요소로 갖는 새로운 튜플을 리스트로 만들어준다. ex) enumerate(genres) -> [(0,genres[0]), (1, genres[1])]
  • itemgetter : sort로 리스트 정렬시 정렬 기준 key값을 한 요소의 특정 값으로 선정해준다. ex) sorted(listname, key=itemgetter(1),reverse=True) 

Comments

Popular posts from this blog

[Python][Algorithm] 소수 판별(에라토스테네스의 체)