문제

 

참고한 코드
def solution(genres, plays):
    
    album = {}
    sum_l = {}
    
    for i in range(len(genres)):
        if genres[i] not in album:
            album[genres[i]] = [(plays[i], i)]
            sum_l[genres[i]] = plays[i]
        else:
            album[genres[i]].append( (plays[i], i))
            sum_l[genres[i]] += plays[i]
            
    sort_sum = sorted(sum_l.items(), key= lambda x : x[1], reverse=True)
    # print('sort_sum = ', sort_sum)
    
    for key in album.keys():
        album[key].sort(key = lambda x : x[0], reverse=True)
    # print('album = ', album)
    
    result_dic = {}
    for i in sort_sum:
        for key in album.keys():
            if i[0] == key:
                result_dic[key] = album[key]
    # print('result_dic = ', result_dic)
    result = []
    for value in result_dic.values():
        if len(value) > 1:
            for i in range(2):
                result.append(value[i][1])
        else:
            result.append(value[0][1])
    
    return result

> 참고한 블로그

https://velog.io/@tanger2ne/python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B2%A0%EC%8A%A4%ED%8A%B8%EC%95%A8%EB%B2%94

 

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

프로그래머스 - 베스트앨범 문제풀이

velog.io

 

내가 해석한 코드 설명
album = {}
sum_l = {}

> album 변수는 genre와 genre에 맞는 각각의 plays를 담기위한 dict 자료형이다.

> sum_l 변수는 unique한 genre의 plays 합을 담기위한 dict 자료형이다.

 

for i in range(len(genres)):
    if genres[i] not in album:
        album[genres[i]] = [(plays[i], i)]
        sum_l[genres[i]] = plays[i]
    else:
        album[genres[i]].append( (plays[i], i))
        sum_l[genres[i]] += plays[i]

> for문(반복문)을 사용하여 genres 에 길이만큼 반복을 진행해준다. 솔직히 저기서 len(genres)가 아니라 len(plays)를 해줘도 무방하다.

> 여기서 if-else문을 사용하여 album 자료형에 genres의 값들이 존재한다면 매번 값이 바뀌기 때문에 존재하지 않을때는 album[genres[i]] = [(plays[i], i)]를 해주지만, 그러지 않을때는 append 함수를 사용해야 한다.

> album 자료형에는 (plays[i], i)로 해주는 이유는 결과값이 고유번호로 출력을 해주어야 하기 때문에 고유번호에 맞는 plays 수를 같이 묶어서 넣어준 것이다.

> sum_l 자료형은 unique한 genres의 합을 구해야 하기 때문에 처음일때는 sum_l[genres[i]] = plays[i]로 하지만 나중에는 sum_l[genres[i]] += plays[i] 로 값을 더해준다.

 

sort_sum = sorted(sum_l.items(), key= lambda x : x[1], reverse=True)

> sort_sum 변수는 unique한 genres의 plays 합인 sum_l 변수를 plays 가 많은 순서대로 내림차순 정렬을 하기 위한 변수입니다.

> 여기서 알게된 것은 .items() 함수입니다. 이것을 이용하면 dict 형이 예를 들면 {'밥' : '한식'} 인 dict형이 items() 함수를 사용하면 ('밥', '한식) 으로 묶어질 수 있다는 것이였다!!

> 그러므로 sum_l.items() 함수를 사용하면 기존 {'genres' : 'plays'의 합} -> ('genres', 'plays'의 합) 으로 바뀌게 되고, sorted() 함수에 있는 key 값을 lambda x : x[1]로 해주면 x[1]인 plays의 합 기준으로 내림차순이 정렬되므로 원하는 plays가 많은 genres 순대로 sort_sum 변수 값을 만들수 있게 된다.

 

for key in album.keys():
    album[key].sort(key = lambda x : x[0], reverse=True)

> 이 코드는 genre 별 고유번호와 plays 값으로 이루어진 album 변수를 genre별 고유번호의 plays가 높은 순으로 정렬하기 위한 코드입니다.

> album.keys() 를 사용하면 album의 키인 genre 가 추출되게 되고, for문을 사용하면 album의 key 가 차례대로 추출되게 된다.

> album[key]는 곧 plays 수와 고유번호의 묶음들로 이루어져있고, sort() 함수를 사용하여 key = lambda x : x]0]으로 진행하면 x[0]인 plays의 수가 많은 고유번호 순으로 내림차순을 진행한다. 

> 반복문이기 때문에 각 장르별 plays의 내림차순이 진행이 된다.

 

result_dic = {}
for i in sort_sum:
    for key in album.keys():
        if i[0] == key:
            result_dic[key] = album[key]

> result_dic 자료형은 genres의 plays 합계가 많은 순대로 값을 넣기 위한 변수입니다.

> 이중 for문을 사용하여 genres의 plays 합계가 높은 순으로 정렬된 sort_sum을 가장 먼저 for문을 사용하고, 그 다음 album.keys()를 반복문에 사용하여 sort_sum의 plays 가 높은 genre가 album의 key와 같다면 result_dic[key] = album[key]로 작성을 하여 값을 넣어준다.

 

result = []
for value in result_dic.values():
    if len(value) > 1:
        for i in range(2):
            result.append(value[i][1])
    else:
        result.append(value[0][1])

> result 변수는 원하는 값 순서대로 결과를 추출하기 위한 변수입니다.

> for문을 사용하여 result_dic.values() 를 순서대로 추출해준다. result_dic.values()는 plays 합계가 높은 순인 genres의 고유번호 plays 가 저장되어 있는 변수의 고유번호와 plays가 저장된 값이다.

> if-else문을 사용하여 value 값이 1보다 크다면 최대 두개까지 추출할 수 있으므로 그 안에 for문을 한 번 더 사용하고, result.append(value[i][1]) 을 사용하여 각 value의 고유번호를 result의 추가해준다.

> len(value)가 1보다 같거나 작다면 그대로 result.append(value[0][1])로 작성을 해준다.

 

아쉬운 점

> 솔직히 쉽게 풀줄 알았는데... ㅜㅜ 상당히 복잡하다...

+ Recent posts