프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

✏️ 내가 작성한 코드

def solution(genres, plays):
    play_dic = {} # 인덱스, 재생수 딕셔너리
    total_play_dic = {} # 총 재생수 딕셔너리
    album_list = [] # 고유번호가 들어있는 최종 베스트 앨범

    for i,genre in enumerate(genres):
        try:
            total_play_dic[genre] += plays[i]
            play_dic[genre] += [(i, plays[i])]
        except:
            total_play_dic[genre] = plays[i]
            play_dic[genre] = [(i,plays[i])]

    for i in sorted(total_play_dic.items(),key=lambda x:x[1],reverse=True):
        sort_play_dic = sorted(play_dic[i[0]], key=lambda x:(-x[1],x[0])) # 내림차순은 -x, 오름차순은 x
        i_cnt = 0
        for play in sort_play_dic:
            if i_cnt == 2: # 장르별로 노래 2개씩만 앨범에 담음. 따라서 2개 되면 break
                break
            album_list.append(play[0])
            i_cnt += 1

    return album_list

 

✏️ 참고

1 ) 첫번째 for문에서 try, except하는 이유 :

처음에는 딕셔너리 내에 key가 존재하지않기 때문에 total_play_dic[genre], play_dic[genre]에 += 구문을 사용하여 value에 값을 더하려고 하면 에러가 발생한다.

그래서 예외처리로 키와 값을 지정하여 아래처럼 각 딕셔너리에 첫 값을 지정해준다.             

total_play_dic[genre] = plays[i]
play_dic[genre] = [(i,plays[i])]

 

2 ) 딕셔너리.items()를 사용하면 value값으로 정렬이 가능하다. (sorted() 사용)

* sort() : 딕셔너리, 튜플, 문자열에는 사용 불가,
sorted() :딕셔너리, 튜플, 문자열에도 사용 가능

 

3 ) sorted에서 key를 여러개 하여 정렬할때, lamda에서 x 통해 여러개 지정 가능.

ex ) key=lambda x:(-x[1],x[0]

reverse대신 '-' 사용하여 내림차순 사용 > x 앞에 - 붙으면 '내림차순', 안붙으면 '오름차순'

+ Recent posts