본문 바로가기
Algorithm/Programmers

[프로그래머스] 코딩테스트 고득점 Kit > 베스트앨범

by du.it.ddu 2019. 11. 5.
반응형

# 문제

# 문제 접근

정답을 도출하기 위해 필요한 것은

가장 많이 재생 된 장르의 순서 / 장르별로 포함 된 노래의 재생 횟수 ,노래의 고유 번호

가장 많이 재생 된 장르의 순서를 알기 위해선, "장르" : "총 재생된 횟수" 가 필요하다.

장르별로 포함 된 노래의 재생 횟수를 알기 위해선, "장르" : "노래의 재생 횟수 리스트" 가 필요하다.

장르별로 포함 된 노래의 고유 번호를 알기 위해선, "장르" : "노래 고유 번호 리스트" 가 필요하다.

위를 딕셔너리로 구조화 시키면,

{ "장르" :

            { "총 재생 횟수" : N, "노래 리스트" : (재생 횟수, 고유 번호) }

}

와 같이 만들 수 있다.

# 문제 풀이

1. 위에서 구조화한 딕셔너리를 만들기 위해 빈 딕셔너리를 생성한다.

2. genres와 plays를 순회하며 구조에 맞게 딕셔너리에 저장한다.

3. sorted함수를 사용하여 딕셔너리를 총 재생횟수를 기준으로 역순 정렬하여 리스트로 얻는다.

4. 역순으로 정렬되었기 때문에 앞의 요소부터 참조하면 가장 많이 재생된 장르부터 참조할 수 있다.

5. sorted함수를 사용하여 각 장르의 노래 리스트를 각 노래의 재생횟수를 기준으로 역순 정렬하여 리스트로 얻는다.

6. min함수를 사용하여 만약 노래 리스트의 길이가 2보다 크면 2로, 아니라면 노래 리스트의 길이만큼 노래의 고유번호를 정답 리스트에 저장한다.

7. 정답 리스트를 반환한다.

# 코드 작성

def solution(genres, plays):
    answer = []
    
    # 1. 비어있는 딕셔너리 생성
    genres_dict = {}
    
    # 2. 리스트를 순회하여 딕셔너리에 값을 저장한다.
    for i in range(len(genres)) :
        genre = genres[i]
        play = plays[i]
        
        # 3. 최초에  총 재생횟수인 "plays"는 0, 노래 정보 리스트인 "infos"는 [] 로 초기화한다.
        if genre not in genres_dict :
            genres_dict[genre] = {
                "plays" : 0,
                "infos" : []
            }
        
        # 4. 총 재생횟수와 노래 정보 리스트에 정보를 저장한다.
        genres_dict[genre]["plays"] += play
        genres_dict[genre]["infos"].append((play, i))
    
    # 5. 총 재생횟수인 "plays"를 기준으로 역순 정렬 한다.
    sorted_genere_infos = sorted(genres_dict.items(), key = lambda x: x[1]["plays"], reverse = True)
    
    # 6. 역순 정렬한 리스트를 순회한다.
    for sorted_genere_info in sorted_genere_infos :
    	# 7. 각 노래의 재생 횟수로 역순 정렬한다.
        sorted_infos = sorted(sorted_genere_info[1]["infos"], key = lambda x: x[0], reverse = True)
        
        # 8. 노래의 개수가 2보다 크면 2로, 그 이하면 그 이하로 저장한다.
        id_count = min(len(sorted_infos), 2)
        
        # 9. 노래의 고유 번호를 저장한다.
        for i in range(id_count) :
            answer.append(sorted_infos[i][1])
    
    # 10. 결과를 반환한다.
    return answer

 

 * 본 문제의 출처는 프로그래머스(https://programmers.co.kr/) 입니다. 문제가 될 시 삭제하겠습니다.

반응형