hye-log

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

CodingTest/Programmers

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

iihye_ 2022. 11. 9. 01:55

0. 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

1) 노래가 많이 재생된 장르 먼저 수록

2) 장르 내에서 많이 재생된 노래 먼저 수록

3) 같은 재생 노래 중에서 고유 번호가 낮은 노래를 먼저 수록

 

2. 입출력

# input
genres = ["classic", "pop", "classic", "classic", "pop"]
plays = [500, 600, 150, 800, 2500]

# output
return = [4, 1, 3, 0]

 

3. 코드

def solution(genres, plays):
    answer = []
    genres_dict = {x:0 for x in genres}                                                 # 초기화 된 딕셔너리 만들기
    
    # 전체 장르별 재생 수 구하기
    for i in range(len(genres)):
        if genres[i] in genres_dict.keys():                                             # 딕셔너리 key에 장르가 있으면
            genres_dict[genres[i]] += plays[i]                                          # 해당 장르에 재생 수 추가
    genres_dict = dict(sorted(genres_dict.items(), key=lambda x:x[1], reverse=True))    # 재생 수 기준으로 정렬

    # 장르별 재생 수 넣기
    for i in list(genres_dict.keys()):
        temp = []
        for j in range(len(genres)):
            if i == genres[j]:                                                          # 딕셔너리 key와 같은 장르이면
                temp.append((plays[j], j))                                              # temp에 재생 수와 고유 번호 추가
        temp.sort(key=lambda x:(-x[0], x[1]))                                           # 재생 수 내림차순, 고유 번호 오름차순으로 정렬

    # 장르별 상위 2개 곡 고르기
        if len(temp) == 1:                                                              # 곡이 1곡인 경우
            answer.append(temp[0][1])                                                   # 1곡만 추가함
        else:                                                                           # 곡이 2곡 이상인 경우
            answer.append(temp[0][1])                                                   # 2곡을 추가함
            answer.append(temp[1][1])

    return answer

실행 결과

 

4. 회고

이 문제의 핵심은 '장르와 노래를 어떻게 정렬할 것인가'라고 생각한다.

# 전체 장르별 재생 수 구하기
for i in range(len(genres)):
    if genres[i] in genres_dict.keys():                                             # 딕셔너리 key에 장르가 있으면
        genres_dict[genres[i]] += plays[i]                                          # 해당 장르에 재생 수 추가
genres_dict = dict(sorted(genres_dict.items(), key=lambda x:x[1], reverse=True))    # 재생 수 기준으로 정렬

제일 먼저 구해야 하는 것은 '가장 많이 재생된 장르'를 찾는 것이다. 리스트보다는 key-value 형태로 정리할 수 있는 딕셔너리가 적합하다고 생각했고, 딕셔너리를 초기화하여 만들어줬다. 처음에는 딕셔너리만 정의하고 초기화를 하지 않았는데, 이렇게 만들다보니 장르를 추가하고, 해당 장르(key)의 재생 수(value)를 구하는 과정에서 에러가 발생했다. 따라서 가장 많이 재생된 장르를 찾을 때에는 딕셔너리를 초기화하고, 해당 장르(key)에 재생 수(value)를 더하는 방법을 사용했다. 그 후에는 정렬을 해주는데, 딕셔너리를 정렬할 때 오류가 나길래 찾아보니까 딕셔너리는 key, value로 나뉘어져 있기 때문에 값을 tuple 형태로 불러와서 정렬을 해야한다. 따라서 items() 함수를 이용하여 딕셔너리의 값을 불러오고, lambda를 이용하여 재생 수(value)를 기준으로 정렬한 뒤 다시 딕셔너리로 만들어주었다.

# 장르별 재생 수 넣기
for i in list(genres_dict.keys()):
    temp = []
    for j in range(len(genres)):
        if i == genres[j]:                                                          # 딕셔너리 key와 같은 장르이면
            temp.append((plays[j], j))                                              # temp에 재생 수와 고유 번호 추가
    temp.sort(key=lambda x:(-x[0], x[1]))                                           # 재생 수 내림차순, 고유 번호 오름차순으로 정렬

 

다음으로 구한 것은 '장르 내에서 많이 재생된 곡'을 찾는 것이다. 딕셔너리의 key를 기준으로 반복문을 작성하였다. 이때, dict.keys()는 dict_keys type이므로 list 형태로 변환하여 반복문에 넣어준다. input인 genres와 현재 key 값이 같을 경우 temp에 재생 수와 고유 번호를 저장한다. 특정 장르의 곡이 모두 저장되면, 정렬을 통해서 재생 수를 기준으로 내림차순, 같은 재생 수인경우 고유 번호를 기준으로 오름차순으로 정렬한다. 정렬 기준이 2개이고 서로 다른 기준(오름차순, 내림차순)으로 정렬하는 경우, 내림차순은 기준 앞에 -(마이너스)를 붙이면 된다.

# 장르별 상위 2개 곡 고르기
if len(temp) == 1:                                                              # 곡이 1곡인 경우
    answer.append(temp[0][1])                                                   # 1곡만 추가함
else:                                                                           # 곡이 2곡 이상인 경우
    answer.append(temp[0][1])                                                   # 2곡을 추가함
    answer.append(temp[1][1])

다음으로 '장르 내에서 많이 재생된 최소 2곡'을 찾는 것이다. 만약 temp의 개수가 1개인 경우에는 1곡만 추가하고, 2곡 이상인 경우에는 2곡을 추가한다. 여기서 0곡일 수는 없는 게, 애초에 temp에 저장할 때 genres의 종류만큼(keys) temp 문을 실행시켰기 때문에 0은 고려하지 않아도 된다.

마지막으로 answer를 return 하면 된다.

 

5. Github

https://github.com/iihye/Algorithm/blob/main/Programmers/best_album.py

 

GitHub - iihye/Algorithm

Contribute to iihye/Algorithm development by creating an account on GitHub.

github.com

 

728x90
Comments