Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 파이썬
- boolean
- 커리어
- 2020 채용
- 매직 넘버
- 함수
- min heap
- 가이드
- 부등호
- John Sonmez
- permutations
- max-heap
- 가독성
- 그리디
- 함수화
- 프로그래머스
- 대소 비교
- enumerate
- 조합
- deque
- ZIP
- 탈출 조건
- 변수명
- 중첩문
- 중첩
- 코딩테스트
- 스택/큐
- 임시 변수
- 중간 변수
- 힙
Archives
- Today
- Total
Better Code, Better Life
베스트앨범 - 프로그래머스 - 파이썬 풀이 본문
문제 풀이
1. 일단 많이 재생된 장르 순으로 정렬해야 합니다.
이 때, 해쉬 자료구조인 dict를 이용해서 시간복잡도를 줄입니다.
genres, plays 두개의 리스트를 한번에 순환하기 위해 zip으로 묶어줍니다.
여기서 다양한 리스트 정렬 방법들을 익힐 수 있습니다.
2. 그러고 많이 재생된 장르 순서로, 장르별 탑2곡의 index를 뽑아냅니다.
이 때 두 번째 indexing 방법을 고민해봐야 합니다.
클린 코드 작성법
- 여러번의 단계를 거쳐 문제가 해결됩니다. 단계마다 함수(모듈)을 이용해 복잡성을 줄이면 좋습니다.
첫번째 단계는 get_sorted_genres_by_popularity으로 해결이 됐다면 더 이상 생각하지 않아도 됩니다. - 변수를 선언 할 때, 그 변수의 사용 지점과 최대한 가까이에서 코드를 작성하면 좋습니다. 그래야 읽는 사람의 부담을 덜어줍니다.
읽는 사람은 변수의 사용이 끝나기 전까지 머리 속에 남겨두어야 하기 때문에, 변수의 생성부터 소멸까지 코드가 많다면 부담이 갑니다. - for문, if문의 중첩이 깊어진다면 내부의 로직을 함수로 만들어 가독성을 높입니다.
get_unique_index 함수를 통해 if 문 중첩을 줄일 수 있었고 index에 대한 처리를 추상화할 수 있었습니다.
해답 코드
from collections import Counter
def get_sorted_genres_by_popularity(genres, plays):
zipped = list(zip(genres, plays))
zipped.sort(reverse=True)
genre_play_dict = {}
for genre, play in zipped:
if genre not in genre_play_dict:
genre_play_dict[genre] = 0
genre_play_dict[genre] += play
genres_rank = sorted(genre_play_dict, key=genre_play_dict.get, reverse=True)
zipped.sort(key=lambda x: genres_rank.index(x[0]))
return zipped
def get_unique_index(original, genre, play, answer):
index = original.index((genre, play))
if index in answer:
next_part = original[index+1:]
index = index + 1 + next_part.index((genre, play))
return index
def solution(genres, plays):
sorted_genres = get_sorted_genres_by_popularity(genres, plays)
# (많이 재생된 장르 순서로) 장르별 탑2곡의 index를 뽑아낸다.
genre_counter = Counter()
answer = []
original = list(zip(genres, plays))
for genre, play in sorted_genres:
if genre_counter[genre] < 2:
genre_counter[genre] += 1
index = get_unique_index(original, genre, play, answer)
answer.append(index)
return answer
도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!
알고리즘 연습 - 베스트앨범 | 프로그래머스
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 play
programmers.co.kr
'Coding Test > Programmers' 카테고리의 다른 글
탑 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.26 |
---|---|
프린터 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.24 |
위장 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.20 |
전화번호 목록 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.17 |
완주하지 못한 선수 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.16 |
Comments