ProblemSolving/Hash

프로그래머스 베스트앨범 (파이썬)

OSNIM 2022. 5. 5. 11:45
반응형

Level 3 해시

 

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

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

제출 코드

 

def solution(genres, plays):
    answer = []
    dic = {}
    #장르별로 플레이와 인덱스 추가
    for i in range(len(genres)):
        # 딕셔너리도 append 가능
        if genres[i] in dic:
            dic[genres[i]].append([plays[i], i])
        else:
            dic[genres[i]] = [[plays[i], i]]

    #장르의 총합
    genTotal = {genre: 0 for genre in genres}
    for i in range(len(genres)):
        genTotal[genres[i]] += plays[i]
    # 장르의 우선순위 정하기
    sgenTotal = sorted(genTotal.items(), key=lambda x: -x[1])

    #장르 안의 곡의 우선순위 정하기
    for k in dic.keys():
        dic[k].sort(key = lambda x : -x[0])

    #장르별 앞에서 2개 또는 1개 뽑기
    for gen, total in sgenTotal:
        if len(dic[gen]) == 1:
            answer.append(dic[gen][0][1])
        else:
            answer.append(dic[gen][0][1])
            answer.append(dic[gen][1][1])

    return answer

 

정리 및 복습 

저는 딕셔너리에서 장르를 키값으로 하면 마지막에 나온 장르 값이 앞의 값을 계속 초기화 하는 문제가 발생했습니다. 이를 배제하고 문제를 풀 수 있는 방법이 도저히 생각나질 않아서 검색을 해서 힌트를 얻었습니다.

딕셔너리에서도 값을 리스트로 설정하면 append가 가능하는 것을 배우고 바로 적용시켰습니다.

중복하여 장르가 한번에 해결되니 문제가 바로 풀렸습니다.

 

장르의 합을 구하는 경우 딕셔너리로 값을 모두 0으로 초기화한 뒤, 인덱스로 한번에 해결하였습니다.

프로그래머스가 한 알고리즘을 집중적으로 기르는 데는 백준보다 좋은 것 같습니다.

반응형