알고리즘/해시

[프로그래머스] 베스트앨범 - 파이썬(python)

아뵹젼 2022. 5. 6.

 

 

나의 풀이 

def solution(genres, plays):
    answer = []
    dic = {}
    dic2 = {}
    # dic 에 key : 장르, 
    # value : 장르 총 재생횟수 를 저장한다.
    # dic2 에 key : 장르,
    # value : (수록곡 재생횟수, 고유번호) 을 저장한다.
    
    for i, (j,k) in enumerate(zip(genres, plays)):
        if j not in dic :
            dic[j] = plays[i]
        else :
            dic[j] += plays[i]
        if j not in dic2 :
            dic2[j] = [(plays[i], i)]
        else :
            dic2[j].append((plays[i],i))
    
    # dic 의 (key, value) 에 대해 value 값으로 내림차순 정렬한다.
    for i, _ in sorted(dic.items(), key=lambda x:x[1], reverse=True) :
        # dic2 의 key 값이 i인 values 에 대해서, (수록곡 재생횟수의 내림차순, 고유번호의 오름차순) 순서대로 정렬한다. 
        #이때 values list 중 0,1번째 인덱스에 대해서만 다룬다.
        for j, k in sorted(dic2[i], key=lambda x: (-x[0], x[1]))[:2] :
            answer.append(k)
    return answer

알고리즘 자체는 생각해낼 수 있었지만,

파이썬 문법이 아직 익숙하지 않아 조금 애를 먹었다...

 

enumerate : 인덱스를 자동으로 생성해준다.

zip : 크기가 같은 iterable한 데이터들을 쌍으로 엮어 tuple 을 생성해준다.

딕셔너리.items() -> 반복문에서 딕셔너리의 (key, values) 을 한번에 탐색하고 싶을 때 사용한다.

 

 

댓글