티스토리 뷰
💡 문제 해결 아이디어
- 리스트의 정렬을 간단하게만 이해하면 된다!
- 리스트는 기본적으로 오름차순(작은 숫자부터 차례대로)으로 정렬된다.
- 리스트 안에 리스트들이 있다면, 첫번째 요소를 기준으로 먼저 정렬한다.
첫번째 요소의 값이 같으면 두번째 요소를 기준으로 정렬한다. > 문제 조건 3번
두번째 요소의 값이 같으면 세번째 요소..... 이후 동일하다!
- 코드의 간결함을 위해 lambda와 list comprehension(이름만 어려움)을 사용한다!
- 코드와 주석을 보면 이해가 쉬울 것이다!
💻 작성된 코드(기본ver.)
def solution(genres, plays):
# 각 장르별로 노래 재생수와 인덱스를 담기 위한 dict
music_dict = {}
# for문을 돌면서
for i in range(len(genres)):
genre = genres[i]
# 만약 해당 장르가 처음 나왔다면, dict에 추가해주고
if genre not in music_dict:
music_dict[genre] = []
# 해당 장르에 [-플레이횟수, 인덱스]를 추가해준다!
# 1. -를 붙이는 이유: 정렬이 기본적으로 작은 것부터 먼저 되기에.
# 2. [-플레이횟수, 인덱스] 순서인 이유: 많이 재생된 노래를 먼저 수록하고,
# 재생횟수가 같을 경우, 인덱스가 낮은 노래를 먼저 수록하기 위해서!
music_dict[genre].append([-plays[i], i])
# 정렬을 위한 임시 앨범
album = []
for genre, songs in music_dict.items():
# 해당 장르의 노래들을 정렬. [-플레이횟수, 인덱스]로 구성되었기에
# 플레이횟수가 클수록, 그리고 인덱스가 작을수록 앞으로 온다.
songs.sort()
album.append(songs)
best_album = []
# 문제 조건 1번, '속한 노래가 많이 재생된 장르를 먼저'를 만족시키기 위해,
# 각 장르별 플레이횟수의 합으로 정렬
album.sort(key= lambda genre: sum([cnt for cnt, idx in genre]))
# 각 장르별로 앞의 2개만, 앨범에 추가한다.
for genre in album:
best_album.extend([index for play, index in genre[:2]])
return best_album
💻 작성된 코드(겉멋ver.)
- 등록되지 않은 key도 알잘딱 등록해주는 defaultdict 사용 (파이썬 기본 내장 함수)
- sorted 함수와 list comprehension을 활용한 겉멋.
- extend가 아니라 굳이 += 를 활용하는 겉멋. (리스트끼리 더하면 extend가 알아서 된다.)
from collections import defaultdict
def solution(genres, plays):
# 각 장르별로 노래 재생수와 인덱스를 담기 위한 dict
music_dict = defaultdict(list)
for i in range(len(genres)):
music_dict[genres[i]].append([-plays[i], i])
# 정렬을 위한 임시 앨범
album = [sorted(songs) for songs in music_dict.values()]
album.sort(key= lambda genre: sum([cnt for cnt, idx in genre]))
best_album = []
# 각 장르별로 앞의 2개만, 앨범에 추가한다.
for genre in album:
best_album += [index for play, index in genre[:2]]
return best_album
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스, 파이썬] 게임 맵 최단거리 (DFS/BFS) (0) | 2023.01.04 |
---|---|
[프로그래머스, 파이썬] 타겟넘버 (DFS, 재귀) (0) | 2023.01.03 |
[프로그래머스, 파이썬] 위장 (해시) (0) | 2023.01.01 |
[프로그래머스, 파이썬] 전화번호 목록 (해시) (0) | 2023.01.01 |
[프로그래머스, 파이썬] 완주하지 못한 선수 (해시) (0) | 2023.01.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- heap
- 디펜스
- 프로그래머스 문자열 나누기
- 프로그래머스 파이썬
- stablediffusion
- python
- 코테
- ChatGPT
- 문자열 나누기 파이썬
- OpenAI
- Stable Diffusion
- 프로그래머스 연속된수의합
- 연습문제
- 가장 가까운 글자 파이썬
- leetcode
- 파이썬
- Attend and Excite
- 프로그래머스
- 스테이블디퓨전
- 프로그래머스 햄버거 만들기
- 코딩테스트
- Low Manifold Theory
- heapq
- 그리디
- BFS
- 인공지능
- 큐
- 프로그래머스 아이템줍기
- 프로그래머스 가장 가까운 글자
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함