일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코딩테스트
- applicationeventpublisher
- 문자열
- spring security
- Spring
- Greedy
- 프로그래머스
- 라이브템플릿
- java
- beandefinitionstoreexception
- 파이썬
- 소수
- springboot
- brute force
- javascript
- 알고리즘
- 탐욕법
- API
- Python
- 2018 KAKAO BLIND RECRUITMENT
- 2981
- counting elements
- error
- 최단경로
- Dijkstra
- 백준
- BFS
- HTTP
- codility
- algorithm
Archives
- Today
- Total
Altiora Petamus
베스트 앨범 본문
🤔생각해보기
먼저 문제의 조건을 살펴보자면,
- 속한 노래가 많이 재생된 장르를 먼저 수록 → 각각 장르의 재생 횟수를 정렬된 상태로 봐야 한다.
- 장르 내에서 많이 재생된 노래를 먼저 수록 → 특정 장르에서 어떤 노래가 많이 재생되었는지 알아야 한다.
- 고유번호가 낮은 노래를 먼저 수록 → 최초 정렬시 고유번호로 정렬하여 Stable sort 가 유지되도록 유도하기
어느 정도 방향성을 잡은 후엔, 사고를 단순하게 하기 위해 dictionary 를 두 개 선언해서 풀어보았다.
성공
def solution(genres, plays):
answer = []
total_plays = {}
data = {}
# 1. 딕셔너리 만들어주기
for g in range(len(genres)):
total_plays[genres[g]] = total_plays.get(genres[g], 0) + plays[g]
data[g] = (genres[g], plays[g])
# 2. 많이 재생된 순서로 장르 정렬
a = sorted(total_plays.items(), key=lambda x: -x[1])
# 3. 장르 내에서 많이 재생된 노래
for g, c in a:
# 상위 두 개까지만 가져오기
b = sorted(filter(lambda x: x[1][0] == g, data.items()), key=lambda x: -x[1][1])[:2]
for number, info in b:
answer.append(number)
return answer
total_plays 에는 장르의 이름을 키값으로 하여 총 재생된 횟수만 저장된다.
data 에는 키값을 고유 번호로 하고, 값으로는 (장르 이름, 재생횟수)처럼 튜플 형태로 저장한다.
#2 에서는 딕셔너리를 정렬해주는데, sorted 를 사용하여 정렬할 경우, 리스트를 반환 받게되므로 따로 형변환이 필요없다. 그리고 옵션에 -(마이너스) 값을 주면 내림차순으로 정렬된다.
#3 에서도 필터링과 정렬을 하고 있다. 많이 재생된 장르가 a 에 순서대로 저장되어 있으므로 for문을 통해서 하나씩 해당 장르를 꺼낸 후 처리한다.
보다시피 lambda
의 활용이 거의 필수적인 문제다. lambda
를 적절하게 사용하면 훨씬 유연하게 다양한 상황에 대처할 수 있다.
코드 품질 향상을 위한 고민
튜플은 정렬시 첫번째 인자를 기준으로 정렬되므로 (재생횟수, 장르) 로 순서를 바꿔주면 과정을 좀 줄일 수 있겠다.
'1day-1algorithm' 카테고리의 다른 글
Tape Equilibrium (0) | 2021.07.01 |
---|---|
소수 찾기 (0) | 2021.06.29 |
단어 변환 (0) | 2021.06.25 |
블랙잭 (0) | 2021.06.23 |
통계학 (0) | 2021.06.22 |