일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- vscode
- 프로그래머스
- eslint
- eslint-prettier
- REST API
- input 안보임
- git 명령어
- LF
- JadenCase
- lazy-load
- 퀵정렬
- git autocrlf
- expected linebreaks to be 'lf' but found 'crlf' linebreak-style
- 참조타입
- 응답코드
- expected linebreaks to be 'crlf' but found 'lf' linebreak-style
- input type password
- CRA
- git 개행문자
- 원시값
- 가장큰수
- password 안보임
- 개행문자
- CRLF
- git
- HTTPS
- react
- prettier
- k번째수
- IP주소
- Today
- Total
우파루파의 개발 기록
[프로그래머스] 42579: 베스트앨범 본문
안녕하세요.
이번 문제는 프로그래머스의 3단계 문제 '베스트앨범' 입니다.
해시 기반 문제라고 분류가 되어 있네요. 개념이 어려운 문제는 아니었습니다.
이제부턴 문제 사진을 추가하진 않으려고 합니다. 링크로 대체합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/42579
이번 문제는 조건만 잘 따지면 됩니다.
문제 핵심
- 장르별로 가장 많이 재생된 노래를 '모든 종류별로' 노래를'두개(장르에 노래가 한곡만 있을 수 있음)'씩 모아야 함
- 노래는 '고유번호'로 구분, 노래는 (genres[i] = plays[i])
- 수록 기준 우선순위
# 1. 많이 재생된 '장르' 우선. (전체 노래를 종합 했을때)
# 2. 그 장르 내에선 '많이 재생된 노래' 우선.
# 3. 재생 횟수가 같다면, '고유 번호가 낮은' 노래를 먼저 수록
-> 베스트 앨범에 들어갈 노래의 '고유 번호'를 순서대로.
문제 아이디어
1. for문(두가지 배열 동시에)을 돌아 dict를 통해 장르별 play 수를 저장
-> 해당 순회 중 새로운 배열을 return [장르, 플레이 수, 고유번호]
2. 해당 배열을 장르 수 내림차순, 플레이 수 내림차순, 고유 번호 오름차순으로 정렬
3. 그리고 정렬한 배열을 다시 for문을 돌아 2개씩 새로운 배열에 저장.
최종 코드
def solution(genres, plays):
plays_dict = dict()
song_list = []
for i in range(len(genres)):
gen = genres[i]
play = plays[i]
if gen in plays_dict:
plays_dict[gen] += play
else:
plays_dict[gen] = play
song_list.append([gen, play, i])
sorted_song_list = sorted(song_list, key=lambda song: (-plays_dict[song[0]], -song[1], song[2]))
result = []
cnt = 0
for j in range(len(sorted_song_list)):
is_first = j == 0
if j != 0 and sorted_song_list[j-1][0] != sorted_song_list[j][0]:
cnt = 1
result.append(sorted_song_list[j][2])
elif cnt < 2:
cnt += 1
result.append(sorted_song_list[j][2])
return result
테스트 케이스 (기본 제공 테스트케이스 제외)
입력 | 출력 |
["classic", "pop", "classic", "pop", "pop", "pop"] ["classic", "pop", "classic", "pop", "pop", "pop"] |
[2, 0, 1, 5] |
["classic", "pop", "classic", "pop", "pop", "pop", "classic", "jazz"] [1000, 500, 1001, 100, 300, 400, 1002, 50000] |
[7, 6, 2, 1, 5] |
여담
이제 취업을 위해 코딩 테스트를 시간을 신경쓰면서 풀고 있는데 쉽지 않습니다. 과제 테스트로 하고싶어요..
이번 문제도 20-25분 정도 썼습니다. 쉬운 개념인데도 불구하고 빠르게 푸는게 잘 안됩니다.
역시 코딩 테스트는 어렵습니다..
'development > 알고리즘' 카테고리의 다른 글
[백준] 1260: DFS와 BFS (3) | 2024.11.15 |
---|---|
[백준] 1918: 후위 표기식 (0) | 2024.06.20 |
[백준] 1935: 후위 표기식 2 (1) | 2024.06.18 |
[백준] 17299: 오등큰수 (+ 오큰수 문제에 대한 잡담) (0) | 2024.06.18 |
[백준] 2750: 수 정렬하기 (삽입 정렬 ver) (0) | 2024.04.24 |