저고데

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

프로그래머스

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

진철 2023. 1. 15. 20:28
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

본 문제를 간략하게 설명하면 다음과 같다.

노래의 장르를 나타내는 genres 배열과 장르당 몇 번 재생되었는지 나타내는 plays 배열이 주어진다.

장르당 가장 많이 재생된 곡을 최대 2개 담고 가장 많이 재생된 장르 순서대로 나열한 값을 반환하면 된다.

 

코드를 작성하기 위한 과정은 다음과 같다.

1. 먼저 장르당 총 재생 수를 구하기 위해서 딕셔너리를 만들어준다.

2. 내림차순을 순서로 딕셔너리를 정렬한다.

3. 반환해야하는 것은 index로 나타내야하기 때문에 index, key, value를 나타낼 수 있는 enumerate를 사용한다.

4. 최대 두 개씩만 append하여준다.

def solution(genres, plays):
    answer = []
    total={}
    for i in range(len(genres)): #1번 : 딕셔너리를 사용하여 각 장르의 총 재생횟수를 구해준다.
        if genres[i] not in total: #1번 : 딕셔너리의 key에 존재하지 않는다면 대입해주고 있다면 +=연산자를 이용해준다.
            total[genres[i]]=plays[i]
        else:
            total[genres[i]]+=plays[i]
    total=sorted(total.items(), key=lambda x:x[1],reverse=True) #2번 : 람다함수를 사용하여 재생횟수를 기준으로 내림차순 정렬을 해준다.
    
    new_genres=list(enumerate(list(zip(genres,plays)))) #3번 : enumerate를 활용하여 각 index를 편리하게 정의한다.
    new_genres.sort(key=lambda x:x[1],reverse=True) #2번 : 이 역시 람다함수를 사용하여 장르 별로 재생횟수를 기준으로 내림차순 정렬을 해준다.
    
    for i in total:
        cnt=0
        for j in new_genres:
            if j[1][0] == i[0]:
                answer.append(j[0])
                cnt+=1
                if cnt==2: #4번 : 장르마다 append 가능한 수는 최대 2개이기 때문에 cnt가 2가 되면 다른 장르로 넘어간다.
                    break
    
    return answer

본 문제는 재생횟수를 기준으로 내림차순을 했을 때, index값이 사라지는 것이 큰 문제였다.

하지만 enumerate를 사용하여 index를 보존할 수 있어서 큰 어려움 없이 해결할 수 있었다.

딕셔너리, 튜플, 세트 등과 더불어서 여러 가지 기능을 사용할 때, enumerate를 참고하는 것도 좋을 듯 하다.

728x90
반응형

'프로그래머스' 카테고리의 다른 글

[프로그래머스]키패드 누르기  (0) 2023.01.15
[프로그래머스]소수찾기  (1) 2023.01.15
[프로그래머스]단어 변환  (0) 2023.01.13
[프로그래머스]네트워크  (0) 2023.01.13
[프로그래머스]타겟 넘버  (0) 2023.01.13