상세 컨텐츠

본문 제목

[프로그래머스] 해시 - 베스트앨범 (결과 포함)

개발 공부 (알고리즘)

by letprogramming 2021. 8. 21. 22:41

본문

반응형

앨범에 수록되는 노래의 우선순위는 다음과 같다.

1. 가장 많이 재생된 장르

2. 가장 많이 재생된 노래

3. 낮은 고유번호

 

장르 별 총 노래 재생 횟수가 가장 우선순위가 높기 때문에 딕셔너리를 이용해 계산하여 저장했다.

다음으로 고유번호를 알아두어야 했다. 입력받은 리스트의 인덱스가 노래의 고유번호인데 만약 정렬을 한다면 변경이 불가피하다.

따라서 딕셔너리의 키를 고유번호로 하고 값을 장르, 재생 횟수, 장르의 총 재생횟수 형태로 저장했다. 장르 별 총 재생횟수를 노래마다 저장한 이유는 장르 별 총 노래 재생 횟수에 따라 각 고유번호를 정렬해야했기 때문이다. 만약 총 재생횟수가 같다면 각 노래의 재생횟수, 마지막으로 고유번호가 낮은 노래부터 앞에 수록되도록 했다.

 

문제의 조건 중에는 장르 별로 2개의 노래만 수록한다는 조건이 있다.

이를 구현하기 위해서 일단 우선순위대로 정렬한 리스트를 체크하면서 카운트를 증가시켰다.

이미 장르 별로 정렬이 되어 있기 때문에 리스트는 현재 장르끼리 뭉쳐있다. 이를 이용해서 새로운 장르가 나오면 카운트를 초기화하고

카운트가 2가 넘어가도 같은 장르가 나오면 isTwo 플래그를 True로 바꾸어 정답에 포함되지 않도록 했다.

반대로 노래를 하나씩 볼때마다 isTwo 플래그가 False이면 정답리스트에 추가했다.

def solution(genres, plays):
    answer = []
    dic = {}
    genre_dic = {}
    
    for i in range(len(genres)):
        if genres[i] in genre_dic:
            genre_dic[genres[i]] += plays[i]
        else:
            genre_dic[genres[i]] = plays[i]
    
    for i in range(len(genres)):
        if genres[i] in dic:
            dic[i].append([genres[i], plays[i], genre_dic[genres[i]]])
        else:
            dic[i] = [genres[i], plays[i], genre_dic[genres[i]]]
            
    dic_sort = sorted(dic.items(), key=lambda x: (-x[1][2], -x[1][1], x[0]))
    pivot = dic_sort[0][0]
    count = 0
    isTwo = False
    for num, genre in dic_sort:
        if pivot == genre[0]:
            count += 1
            if count > 2:
                isTwo = True
        else:
            pivot = genre[0]
            count = 1
            isTwo = False
        if not isTwo:
            answer.append(num)
    return answer

 

반응형

관련글 더보기