반응형
250x250
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
- AI
- albert
- 직장인자기계발
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- 패스트캠퍼스
- SKT
- R
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- 직장인인강
- 패캠챌린지
- 패스트캠퍼스후기
- 알버트
Archives
- Today
- Total
제주 탈출 일지
[python3] 프로그래머스 레벨 3 - 베스트앨범 본문
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
프로그램 코드
# 20점
def solution(genres, plays):
answer = []
song_dic = dict()
for i in range(len(genres)):
song_dic[genres[i]] = {}
for i in range(len(genres)):
song_dic[genres[i]].setdefault(i, plays[i])
s_song_dic = {}
# 많이 재생한 노래, 노래 고유번호 별 정렬
for i in song_dic:
s_song_dic[i] = sorted(song_dic[i].items(), key = lambda x : (-x[1],x[0]))
sum_genres = {}
# 문제 발생 지점
for i in genres:
tmp = 0
for j in range(len(s_song_dic[i])):
tmp += int(s_song_dic[i][j][1])
sum_genres.setdefault(i,tmp)
s_sum_genres = sorted(sum_genres, key = lambda x : x[1], reverse = True)
for i in s_sum_genres:
for j in range(0, 2):
try : answer.append(s_song_dic[i][j][0])
except : continue
return answer
가장 많이 재생된 장르를 더하는 과정에서 문제를 발견했다.
sum_genres를 처음부터 계산해서 딕셔너리로 만들고, 그 후 sorted 함수를 통해서 정렬.
그 정렬한 순서대로 장르별 많이 재생된 2개의 음악을 넣는데, 2개가 없다면 continue를 통해 다음 장르로 넘어가게 한다.
# 최종 답안
def solution(genres, plays):
answer = []
sum_genres = {}
song_dic = dict()
for i in range(len(genres)):
song_dic[genres[i]] = {}
sum_genres.setdefault(genres[i], 0)
for i in range(len(genres)):
song_dic[genres[i]].setdefault(i, plays[i])
sum_genres[genres[i]] += plays[i]
s_song_dic = {}
# 많이 재생한 노래, 노래 고유번호 별 정렬
for i in song_dic:
s_song_dic[i] = sorted(song_dic[i].items(), key = lambda x : (-x[1],x[0]))
s_sum_genres = dict(sorted(sum_genres.items(), key = lambda x : x[1], reverse = True))
for i in s_sum_genres.keys():
for j in range(0, 2):
try : answer.append(s_song_dic[i][j][0])
except : continue
return answer
이 문제를 풀면서 해맸던 점은 장르 내의 정렬 기준이 2가지라는 점이다.
장르 별 재생건수가 가장 많은 순서대로, 그리고 같은 재생건수의 경우 고유번호가 작은 순으로 정렬해야 하기 떄문에 그 점을 고심하여 코드를 작성하였다.
다른 사람의 풀이
1. 중복이 필요없는 특정 종류를 얻을 때는 set을 사용하자.
2. zip 함수를 사용해서 한번에 깔끔하게 연관 데이터를 관리하자.
3. lambda 함수를 좀 더 고급지게 사용할떄는 map함수를 이용해서 이중으로 사용해보자.
728x90
반응형
'코딩 테스트' 카테고리의 다른 글
[python3] 프로그래머스 레벨 2 - 카펫 (0) | 2021.06.15 |
---|---|
[python3] 프로그래머스 레벨 2 - 소수 찾기 (0) | 2021.06.15 |
[Python3] 프로그래머스 레벨 2 - 위장 (0) | 2021.06.07 |
[Python3] 프로그래머스 레벨 2 - 전화번호 목록 (0) | 2021.06.06 |
[Python3] 프로그래머스 레벨 1 - 완주하지 못한 선수 (0) | 2021.06.06 |
Comments