[프로그래머스] LEVEL3 베스트앨범 (Python)

Loopy·2021년 7월 17일
4

프로그래머스

목록 보기
21/32
post-thumbnail

[프로그래머스] LEVEL3 베스트앨범


🧐 문제 설명


😍 나의 풀이

기본적으로 해시 알고리즘이 이용되는 문제다. 파이썬에서 해시 알고리즘은 딕셔너리를 사용한다. 키-값의 일대일 매핑이 이루어지기 때문이다.

  1. [장르, 재생횟수, 인덱스(고유번호)]를 형식으로 하는 리스트 생성

  2. 조건1. "속한 노래가 가장 많이 재생된 장르를 먼저 수록"을 만족시키기 위해서, 장르를 KEY로 하는 딕셔너리를 생성하여 VALUE에 KEY와 매칭되는 재생횟수를 저장

  3. 조건2.3. "재생 횟수가 많을수록, 같다면 고유번호가 낮을수록 먼저 수록"을 만족시키기 위해서, 1에서 생성한 리스트를 재생횟수 기준 내림차순, 고유번호 기준 오름차순 정렬

  4. 2에서 생성한 딕셔너리 KEY 순서대로 정렬한 리스트를 탐색하며 최대 count 2까지의 고유번호를 수록

def solution(genres, plays):
    answer = []
    temp = []
    total_genre_d = {}

    temp = [[genres[i], plays[i], i] for i in range(len(genres))]   # [장르, 재생횟수, 고유 번호] 리스트
    temp = sorted(temp, key=lambda x: (x[0], -x[1], x[2]))  # 많이 재생될수록, 같다면 고유번호가 낮을수록

    for g in temp:  # {장르 : 총 재생횟수} 딕셔너리 생성
        if g[0] not in total_genre_d:
            total_genre_d[g[0]] = g[1]
        else:
            total_genre_d[g[0]] += g[1]
    
    total_genre_d = sorted(total_genre_d.items(), key = lambda x: -x[1])    # 재생횟수가 많은 순서로 장르 정렬
    
    for i in total_genre_d: # 같은 장르 내에서는 최대 2곡까지 조건대로 수록
        count = 0
        for j in temp:
            if i[0] == j[0]:
                count += 1
                if count > 2:
                    break
                else:
                    answer.append(j[2])

    return answer

👏 다른 사람의 풀이

내 풀이랑 로직은 비슷한데 이 사람은 딕셔너리를 생성할 때 아예 2개를 만들어서 풀이했다. 나는 딕셔너리 1개의 KEY와 리스트의 요소를 비교했는데 딕셔너리 2개를 만들어서 더 코드가 간결해보이는 것 같다.

def solution(genres, plays):
    answer = []

    dic1 = {}
    dic2 = {}

    for i, (g, p) in enumerate(zip(genres, plays)):
        if g not in dic1:
            dic1[g] = [(i, p)]
        else:
            dic1[g].append((i, p))

        if g not in dic2:
            dic2[g] = p
        else:
            dic2[g] += p

    for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
        for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
            answer.append(i)

    return answer

🥇 Today I Learn

파이썬에서 해시 알고리즘은 딕셔너리!!

딕셔너리 Value값을 기준으로 정렬

  • 딕셔너리에 items() 메서드를 사용해주면 {"key" : value}의 형태를 [(key, value)]의 형태로 만들어 준다.

  • 이를 sorted해주면 key값을 기준으로 오름차순으로 정렬한다. value값으로 정렬하려면 lambda를 사용해주면 된다.

sorted(d.items(), key=lambda x : x[1])
profile
공부 쫌 해!!!😂

0개의 댓글