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

김아현·2022년 4월 26일
0

문제 보기

🔒 문제

🔐 해결 과정

  1. 장르별 누적재생횟수 구하기 -> 최다 누적 재생횟수의 장르가 먼저 수록
  2. 장르별 수록 곡 목록 만들기
  3. 수록곡 중 재생횟수가 높은 두 곡을 뽑아 앨범에 넣기
    3'. 만약 재생횟수가 같다면 작은 인덱스의 곡 넣기

🔓 풀이 (1h)

def solution(genres, plays):
    result = []
    dic = {}
    for g, p in zip(genres, plays):
        dic[g] = dic[g] + p if g in dic else p
    order = sorted(dic.items(), key=lambda x: x[1], reverse=True)
    order = map(lambda x:x[0], order)
    for o in order:
        musics = []
        for i, genre in enumerate(genres):
            if(o == genre):
                musics.append((i, plays[i]))
        tmp = sorted(musics, key=lambda x:x[1], reverse=True)[:2]
        tmp = list(map(lambda x:x[0], tmp))
        result += tmp
    return result

🔁 feedback

파이썬의 문법을 익히기 위해서 간결하게 짠 코드를 주로 참고하도록 하자. 익숙해지면 가독성이 더 좋은 코드를 중점으로 보고.

+ 다른사람의 풀이

def solution(genres, plays):
    answer = []
    d = {e:[] for e in set(genres)}
    for e in zip(genres, plays, range(len(plays))):
        d[e[0]].append([e[1] , e[2]])
    genreSort =sorted(list(d.keys()), key= lambda x: sum(map(lambda y: y[0],d[x])), reverse = True)
    for g in genreSort:
        temp = [e[1] for e in sorted(d[g],key= lambda x: (x[0], -x[1]), reverse = True)]
        answer += temp[:min(len(temp),2)]
    return answer
  1. set(genres)로 중복을 제거하고 딕셔너리의 포맷을 설정한다.
  2. 딕셔너리에 같은 인덱스의 장르와 재생횟수 그리고 인덱스를 삽입한다. 장르 : [재생횟수, 인덱스]
  3. 딕셔너리의 키(장르)만 가져와서 값의 0번째 인덱스(재생횟수)를 추출해 모두 더해주고, 결과를 내림차순 정렬한다.
  4. 장르의 순서대로 수록곡 중 두 곡을 선택해야 한다. lambda x: (x[0], -x[1])에서 먼저 x[0]인 재생횟수를 먼저 고려하고, 재생횟수가 같을 경우 x[1]인 인덱스를 비교한다. x[1]-를 붙인 것은 뒤에 reverse=True로 되어있기 때문에 인덱스가 작은 값을 큰 값으로 함을 명시한 것이다. -가 없으면 인덱스가 큰 순으로 정렬된다.
profile
Want to be backend developer

0개의 댓글