티스토리 뷰

문제출처 - https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범 | 프로그래머스

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 play

programmers.co.kr

 

풀이

def solution(genres, plays):
    answer = []
    playDic = {}  # {장르 : 총 재생 횟수}
    dic = {}      # {장르 : [(플레이 횟수, 고유번호)]}
    
    # 해시 만들기
    for i in range(len(genres)):
        playDic[genres[i]] = playDic.get(genres[i], 0) + plays[i]
        dic[genres[i]] = dic.get(genres[i], []) + [(plays[i], i)]
    
    # 재생 횟수 내림차순으로 장르별 정렬
    genreSort = sorted(playDic.items(), key = lambda x: x[1], reverse = True)
    
    # 재생 횟수 내림차순, 인덱스 오름차순 정렬
    # 장르별로 최대 2개 선택
    for (genre, totalPlay) in genreSort:
        dic[genre] = sorted(dic[genre], key = lambda x: (-x[0], x[1]))
        answer += [idx for (play, idx) in dic[genre][:2]]
    
    return answer

분석

  1. 해시 만들기
    1. playDic : { 장르 : 총 재생 횟수 } 형태로 해시를 만듦
    2. dic : { 장르 : [(플레이 횟수, 고유번호)]} 형태로 해시를 만듦
  2. playDic재생 횟수 내림차순으로 장르별 정렬
    1. playDic items()라는 함수를 사용해 튜플로 만듦. x[1]이니까 '총 재생 횟수'를 기준으로 내림차순(reverse = True) 정렬
  3. 이번엔 dic을 재생횟수 내림차순 & 인덱스 오름차순 정렬
    1. -x[0]의 마이너스는 내림차순의 의미
    2. answer에 장르별로 최대 2개의 고유번호 추가

 

딕셔너리의 get(x) 함수는 x라는 key에 대응되는 value값을 돌려준다.

 

만약 get(x, 'Baaaaaaam') 함수에 두번째 인자를 넣어주면 x라는 key가 딕셔너리에 없는 경우, 'Baaaaaaam'을 디폴트 값을 돌려준다.

 

'Baaaaaaam'이라는 key값이 딕셔너리에 없는데 dic['Baaaaaaam']을 사용하면 key 오류를 발생시키는데 get함수를 사용하면 key값이 없어도 오류를 발생시키지 않고 None을 반환해준다.

 

즉, 딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, '디폴트 값')을 사용하면 된다!!

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함