Level 3. 베스트 앨범

Pear_Mh·2021년 8월 2일
0

Programmers-Level 3.

목록 보기
4/5

베스트앨범 [해시(Hash)]

코딩테스트 연습 > 해시 > 베스트앨범

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



문제 구상

  • 입력: 장르를 나타내는 문자열 배열(genres), 노래별 재생 횟수를 나타내는 정수 배열(plays)
  • 출력: 가장 많이 재생 된 장르를 기준으로 1차 정렬 후 재생된 횟수로 2차 정렬하여 장르별 2개씩 고유번호를 리스트형태로 출력
  • 구상:
    1. 노래별 재생횟수의 고유번호를 출력해야 하므로 enumerate()를 이용하여 재생횟수별 고유번호를 생성합니다.
    2. 가장 많이 재생 된 장르 및 장르별 분류를 위해 딕셔너리 형태로 구성하여 계산합니다.
    3. 많이 재생된 장르부터 정렬합니다.
    4. 정렬된 장르를 재생횟수, 고유번호를 기준으로 정렬한 뒤 0,1번째 원소의 고유번호를 출력 리스트에 삽입한 뒤 출력합니다.

문제 풀이

# 입력값
genres= ["classic", "pop", "classic", "classic", "pop"]
plays = [500, 600, 150, 800, 2500]
# 01 play의 고유번호 생성을 위한 enumerate
label = []
for i,p in enumerate(plays): 
    label.append([p,i])
# 02 genres 계산을 위한 딕셔너리 구성
dic = dict() # 장르에 따른 딕셔너리(장르: 곡[재생횟수,고유번호])
title = dict() # 가장 많이 재생된 장르 확인을 위한 딕셔너리(장르: 총 재생횟수)
for g,l in zip(genres,label):
    if g in dic:
        dic[g]+=[l]
        title[g]+=l[0]
    else:
        dic[g]=[l]
        title[g]=l[0]
title = sorted(title.items(),key=lambda x:x[1],reverse=True) # 많이 재생된 장르부터 정렬
#03
answer = []
for g,p in title: #많이 재생 된 장르부터
    dic[g] = sorted(dic[g],key=lambda x: (-x[0],x[1])) # 해당 장르를 재생횟수, 고유번호를 기준으로 정렬
    answer += [i for p,i in dic[g][:2]] #정렬된 장르의 0,1번째 원소의 고유번호를 answer값에 추가
answer    

전체 코드

def solution(genres, plays):
#01 plays의 고유번호 생성을 위해 enumerate를 사용하여 list[i,v] 생성
    label = []
    for i,p in enumerate(plays):
        label.append([p,i])
#02 
    dic = dict()
    title = dict()
    for g,l in zip(genres,label):
        if g in dic:
            dic[g]+=[l]
            title[g]+=l[0]
        else:
            dic[g]=[l]
            title[g]=l[0]
    title = sorted(title.items(),key=lambda x:x[1],reverse=True)

    answer = []
    for (g,p) in title:
        dic[g] = sorted(dic[g],key=lambda x: (-x[0],x[1]))
        answer += [i for (p, i) in dic[g][:2]]
    return answer
profile
Beyond the new era.

0개의 댓글