공부하는 스누피
[Python] 베스트앨범 - Hash 본문
https://programmers.co.kr/learn/courses/30/lessons/42579
생각과정
- 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
결과
정렬 함수: 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
https://brownbears.tistory.com/458
'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