공부하는 스누피

[Python] 베스트앨범 - Hash 본문

Algorithms/코딩테스트 문제풀이

[Python] 베스트앨범 - Hash

커피맛스누피 2020. 8. 28. 18:09

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

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr

 

생각과정

- pre-processing: 장르에 노래 배열을 담는 딕셔너리, 장르에 총 재생횟수를 담는 딕셔너리를 만든다.

- 장르에 속한 노래별로 정렬한다. 재생횟수가 같으면 노래 ID로 정렬한다.

- 장르끼리 정렬한다.

- 정렬된 순으로 장르별 Top2를 추가한다.

 

구현

import operator

def solution(genres, plays):
    answer = []
    count = {}
    gen_count = {}
    for i in range(len(genres)):
        if genres[i] in count.keys():
            data = [i, plays[i]] # 고유번호, 재생횟수
            count[genres[i]].append(data)
            gen_count[genres[i]] += plays[i]
        else:
            count[genres[i]] = [[i, plays[i]]]
            gen_count[genres[i]] = plays[i]
    for g in count.keys():
        count[g]= sorted(count[g], key=lambda c: (c[1]), reverse=True)
    #딕셔너리 소팅
    gen_count = sorted(gen_count.items(), key=operator.itemgetter(1), reverse=True)
    #노래 수록
    for g in gen_count:
        num = 0
        for j in range(len(count[g[0]])):
            if num == 2: break
            answer.append(count[g[0]][j][0])
            num+=1
    #print(gen_count)
    return answer

 

결과

level 3,,

 


정렬 함수: sorted(정렬 대상, key, reverse)

리스트를 오름차순으로 정렬하고 결과값을 리턴한다. (딕셔너리에도 사용할 수 있다.)

key는 정렬 기준이 되는데, 일반 함수를 넣어도 되지만 람다 함수를 사용하는 것이 좋다.

이 문제에서는 count[g] 배열의 1번 인덱스 값이 재생횟수를 의미하기 때문에 lambda c: (c[1])로 값을 정해줬다.

reverse에 True값을 넘겨주면 내림차순으로 정렬한다.

비슷한 함수로 sort가 있는데, 리스트에만 적용되고 리턴값이 없이 바로 리스트를 변경한다는 점에서 차이가 있다.

 

operator.itemgetter(index)

딕셔너리를 정렬하는데 기준이 되는 함수. 딕셔너리 item에서 index 값을 기준으로 정렬할 수 있게 도와준다.

이때, index값이 0이면 key 값, 1이면 value 값을 의미한다.

사용하려면 import operator가 필요하다.

 

 

참고

https://mong9data.tistory.com/33

 

[파이썬/Python] 리스트의 정렬 방법 - sort함수와 sorted함수

리스트의 정렬 프로그래밍 언어에서 리스트 혹은 배열을 정렬하는 알고리즘은 다양하다. 가장 간단한 선택 정렬, 버블 정렬부터 삽입 정렬, 쉘 정렬, 병합 정렬, 퀵 정렬 등의 효율성을 높인 알��

mong9data.tistory.com

https://brownbears.tistory.com/458

 

[Python] operator 모듈 사용해서 연산 처리 속도 빠르게 하기

파이썬에서 문자열을 더하거나 숫자를 곱하는 등의 코딩을 할 때 아래와 같이 연산자를 사용하게 됩니다. result = 'a' + 'b' result2 = 4 * 5 여기서 파이썬 내부적으로 operator 모듈을 호출하여 처리를 ��

brownbears.tistory.com

 

'Algorithms > 코딩테스트 문제풀이' 카테고리의 다른 글

[Python] 압축 - 문자열  (0) 2020.08.31
[Python] 1로 만들기 - DP  (0) 2020.08.30
[JAVA] 피보나치 - DP  (0) 2020.08.23
[JAVA] 스타트와 링크 - DFS  (0) 2020.08.19
[JAVA] 퇴사 - DFS  (0) 2020.08.19
Comments