티스토리 뷰
문제 설명
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
-
속한 노래가 많이 재생된 장르를 먼저 수록합니다.
-
장르 내에서 많이 재생된 노래를 먼저 수록합니다.
-
장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.
제한사항
-
genres[i]는 고유번호가 i인 노래의 장르입니다.
-
plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
-
genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
-
장르 종류는 100개 미만입니다.
-
장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
-
모든 장르는 재생된 횟수가 다릅니다.
입출력 예
genres | plays | return |
[classic, pop, classic, classic, pop] |
[500, 600, 150, 800, 2500] |
[4, 1, 3, 0] |
입출력 예 설명
classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.
-
고유 번호 3: 800회 재생
-
고유 번호 0: 500회 재생
-
고유 번호 2: 150회 재생
pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.
-
고유 번호 4: 2,500회 재생
-
고유 번호 1: 600회 재생
따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.
풀이과정
이 문제 또한 해시 문제이므로 어느 변수를 key, value로 할지 먼저 생각해야 한다.
또, 풀 방법이 한 번에 뙇 생각나질 않아서 문제 설명에서 형광펜 쳐놓은 1,2,3에 걸쳐 되어있는 것을 한참 보고 생각했다. 저렇게 친절하게 문제 설명 되어있는게 고마울 정도로 저 1,2,3번이 도움이 되었다.
이 문제에서는 해시 테이블을 2번에 걸쳐서 사용했다. 해시테이블을 작성할 때에는 목적에 맞게 key, value를 무엇으로 할지 생각하고, 구현했다. key와 value를 적절히 생각만 하면 구현하는 것은 쉬웠다.
key와 value를 정할 때에는 key가 고유한 값이라는 것을 계속 고려하면서 생각했다.
1단계.
1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
속한 노래가 많이 재생된 장르를 먼저 수록하라고 했으니, 장르 별 재생된 총 횟수를 구해야 한다.
따라서 key : 장르, value : 총합 으로 해시테이블인 songs를 선언했다.
그리고 총합 기준으로 정렬해주었다.
총합이 큰 것부터 pop되어 나갈 것이다.
2단계.
2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
이제 장르 내에서 많이 재생된 노래를 수록해야 한다. 이를 위해서 key : 고유번호, value : plays수 로 해시테이블을 작성하였다.
출력하는 리스트를 dic으로 선언하였고, 장르 별로 plays수가 큰 것을 출력해야 하기 때문에, value를 기준으로 내림차순으로 정렬해서 앞의 2개 원소의 key값, 즉 고유번호를 answer에 넣어주면 된다.
이때, 주의할 점!
제한사항 중,
장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
이런 내용이 있다.
따라서 주석에 달아놓았듯이, dic 이 한개라면, 하나만 answer에 추가되도록 하였다.
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
|
def solution(genres, plays):
answer = []
songs={}
for i in range(len(genres)): #1단계. 해시테이블songs key:genre, value:총합
if genres[i] not in songs:
songs[genres[i]]=plays[i]
else:
songs[genres[i]]+=plays[i]
while songs: #2단계. 각 장르별로(위의 정렬된 해시테이블dic에서 pop()함) key: 고유번호, value:plays수
dic={}
song=songs.pop()
for i in range(len(genres)):
if song[0]==genres[i]:
dic[i]=plays[i]
if len(dic)==1: #주의할점 : 1개일 땐 그냥 1개 출력
else:
for j in range(2): #많은 2개 출력
return answer
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
'알고리즘, 코딩테스트 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Lv2. 메뉴 리뉴얼 - 파이썬] extend, append 차이, Combinations, Counter 내장함수 (0) | 2022.06.30 |
---|---|
[프로그래머스 Lv1. 신고 결과 받기 - 파이썬] dictionary 이용 문제 풀이 (내 풀이, 모범 풀이 비교) (0) | 2022.06.30 |
[파이썬] 프로그래머스 Level.2 | 해시 | 위장 (0) | 2020.02.12 |
[파이썬] 프로그래머스 Level.2 | 해시 | 전화번호 목록 (0) | 2020.02.12 |
[파이썬] 프로그래머스 Level.1 | 해시 | 완주하지 못한 선수 (0) | 2020.02.12 |
- Total
- Today
- Yesterday
- AWSBedrock
- React native 작동 원리
- easycode chatGPT
- awsgenai
- 알고리즘
- partyrock생성
- 정적 웹사이트 배포
- 술자리병돌리기게임
- partyrock앱
- 코딩테스트
- BOJ
- ChatGPT
- genaiapp
- 백준
- aws생성형ai
- 파이썬
- partyrock사용볍
- S3배포
- SpacewBetween
- partyrock
- 오블완
- 정적 웹페이지 배포
- 생성형AI
- partyrock무료
- 병돌리기구현
- vscode easycode
- S3 403 forbidden
- 티스토리챌린지
- easycode
- PYTHON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |