알고리즘/프로그래머스
[프로그래머스] 베스트앨범 by 파이썬 (Python) : 해시
코딩하는이씨
2023. 8. 13. 15:51
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
난이도
LV 3
문제 설명
장르별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려고한다.
노래는 고유 번호로 구분되며 노래를 수록하는 기준은 아래와 같다.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 plays가 주어질 때 베스트 앨범에 들어갈 노래의 고유번호 순대로 return 해주어야 한다.
접근법
- 먼저 장르 별로 재생 횟수를 합치기 위해서 딕셔너리를 이용하여 장르 별로 재생 횟수를 저장해준다.
- 속한 노래가 많이 재생된 장르를 먼저 수록하므로 재생 횟수별로 장르를 내림 차순 정렬 해준다.
- 노래 장르를 나타내는 배열 genres를 탐색하면서 현재 찾는 장르와 같다면 임시 딕셔너리(temp)에 고유번호:재생횟수 로 저장해준다.
- 해당 장르의 모든 곡이 temp에 저장되면 재생횟수 내림차순으로 정렬해준다.
- return해줄 정답 배열에 가장 재생횟수가 많은 두 곡을 수록해준다.
- 모든 장르에대해 3~5를 반복한다.
장르 별로 계속 genres에 들어있는 배열을 완전 탐색해야하지만 문제에서 주어진 제한사항의 genres의 길이가 10,000이하이기 때문에 별도로 고려하지 않고 탐색을 진행 하였다.
코드
def solution(genres, plays):
answer = []
genre = {}
for i in range(len(genres)):
if genres[i] in genre:
genre[genres[i]] += plays[i]
else:
genre[genres[i]] = plays[i]
g = sorted(genre.items(), key=lambda x: x[1], reverse=True)
for i in range(len(g)):
temp = {}
for j in range(len(genres)):
if genres[j] == g[i][0]:
temp[j] = plays[j]
t = sorted(temp.items(), key=lambda x: x[1], reverse=True)
for k, v in t[:2]:
answer.append(k)
return answer
728x90
반응형