# 문제
# 문제 접근
정답을 도출하기 위해 필요한 것은
가장 많이 재생 된 장르의 순서 / 장르별로 포함 된 노래의 재생 횟수 ,노래의 고유 번호
가장 많이 재생 된 장르의 순서를 알기 위해선, "장르" : "총 재생된 횟수" 가 필요하다.
장르별로 포함 된 노래의 재생 횟수를 알기 위해선, "장르" : "노래의 재생 횟수 리스트" 가 필요하다.
장르별로 포함 된 노래의 고유 번호를 알기 위해선, "장르" : "노래 고유 번호 리스트" 가 필요하다.
위를 딕셔너리로 구조화 시키면,
{ "장르" :
{ "총 재생 횟수" : 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/) 입니다. 문제가 될 시 삭제하겠습니다.
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 코딩테스트 고득점 Kit > 가장 큰 수 (0) | 2020.03.07 |
---|---|
[프로그래머스] 코딩테스트 고득점 Kit > K번째수 (0) | 2020.03.07 |
[프로그래머스] 코딩테스트 고득점 Kit > 위장 (0) | 2019.11.05 |
[프로그래머스] 코딩테스트 고득점 Kit > 전화번호 목록 (0) | 2019.11.05 |
[프로그래머스] 코딩테스트 고득점 Kit > 완주하지 못한 선수 (0) | 2019.11.05 |