몸과 마음이 건전한 SW 개발자

프로그래머스 Lv. 3 베스트앨범 Python [반례 포함] 본문

알고리즘

프로그래머스 Lv. 3 베스트앨범 Python [반례 포함]

스위태니 2023. 12. 30. 20:55

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

def solution(genres, plays):
    answer = []
    genreDict = dict()
    lenGenres = len(genres)
    for i in range(lenGenres):
        genre = genres[i]
        play = plays[i]
        if genreDict.get(genre):
            genreDict[genre].append((play, i))
            genreDict[genre][0] += play
        else:
            genreDict[genre] = [play, (play, i)]
    genreList = sorted(list(genreDict.values()), key=lambda x: x[0], reverse=True)

    for g in genreList:
        lenG = len(g)
        ng = sorted(g[1:], key=lambda x: (x[0], -x[1]), reverse=True)
        for i in range(min(2, lenG-1)):
            answer.append(ng[i][1])
    return answer

풀이 방법

- dictionary에 장르별로 넣는데 맨 앞에 total 노래 재생수를 더해주면서 저장한다.

- 람다식과 sort를 사용해서 가장 많이 재생된 장르 순으로 정렬한다.

- 정렬한 리스트를 바탕으로 각각의 장르별 가장 많이 재생된 순서는 내림차순 그리고 index는 오름차순으로 정렬한다.

    - 둘 중 하나를 마이너스로 처리하면 오름차순 내림차순 정렬하는데 용이하다.

- 장르별 노래 리스트의 최대 2개까지 answer에 append하기 위해서 min(2, lenG-1)를 범위로 설정한다.

느낀점

- 문해력이 조금 낮아서 요즘 책을 읽고 있다.

- 그렇게 어려운 문제가 아니지만 잘 못된 점을 찾지 못하면 늪에 빠진다.

- 늪에 빠졌을 때는 다 지우고 다시 읽자.