문제설명
제한사항
입출력 예
문제 분석
파이썬
입력값으로 2개의 리스트가 입력된다. 노래의 장르로 이루어진 리스트(genres)와 노래의 재생횟수로 이루어진 리스트(plays)가 주어진다. 두 리스트는 같은 인덱스끼리 같은 노래를 가리킨다.
문제에서 친절하게 정답에 접근하는 과정을 설명해줬다. 장르별로 최대 2개만 수록할 수 있다. 가장 많이 재생된 장르를 구해야한다. 그렇다면 같은 장르의 재생횟수를 모두 더해서 장르를 key로 갖고 재생횟수를 value로 하는 딕셔너리를 만들면 되겠다 싶을 것이다.
장르 내에서 가장 많이 재생된 노래를 먼저 수록해야하니까 가장 많이 재생된 장르를 찾는 것이 우선이다. 각 장르별 재생횟수가 담긴 딕셔너리의 value를 기준으로 정렬하면 어찌 저찌 될 것 같은 느낌이다. 정렬 함수는 리스트에 적용할 수 있는 함수이기 때문에 딕셔너리의 key와 value를 배열안에 담아주는 items( ) 함수를 사용할 것이다.
items함수는 딕셔너리의 key와 value를 튜플 형태로 담아서 리스트의 각 요소로 만들고 반환한다. 그렇게 만들어진 리스트를 정렬함수 sorted로 정렬할 때 정렬 기준인 key값을 주어서 value 기준으로 정렬하는데, 이 때 가장 재생이 많이 된 장르가 필요하기 때문에 내림차순으로 정렬해주기 위해서 reverse = True도 해준다. 이제 장르별로 많이 재생된 순으로 정렬된 배열이 만들어졌다.
노래를 수록할 때 재생횟수가 같으면 고유번호가 낮은 노래부터 수록해야한다는 규칙이 있다. 첫번째 제한사항을 보면 고유번호는 해당 노래의 인덱스와 같다. 대략 장르 배열과 새로운 배열을 비교해서 장르가 같다면 최종 배열에 노래를 수록하면 될 것이다. (append) 새로운 배열은 각 노래의 장르, 재생횟수, 고유번호(인덱스)를 요소로 가져야 하기 때문에 2차원 리스트로 만들면 된다. 그렇게 만든 배열을 재생횟수가 높은 것 부터, 고유번호가 낮은 것부터 정렬해야하니까 sorted함수를 사용해서 정렬 기준을 만들어준 후 정렬한다. 만들어진 2개의 배열을 반복문으로 같은 장르인지 비교하고 2번만 들어가게 제한을 만들어주고 최종 배열에 append해주면 된다.
Python3
def solution(genres, plays):
answer = []
cate = {}
temp = []
for idx, genre in enumerate(genres):
cate[genre] = cate.get(genre, 0) + plays[idx]
sorted_value = sorted(cate.items(), key = lambda x:x[1], reverse=True)
temp = [[genres[i], plays[i], i] for i in range(len(genres))]
temp = sorted(temp, key = lambda x: (x[0], -x[1], x[2])) # 재생 수 내림차순, 고유번호 오름차순
for i in sorted_value: # 같은 장르 2곡 추출
count = 0
for j in temp:
if i[0] == j[0]:
count +=1
if count > 2:
break
else :
answer.append(j[2])
return answer
JavaScript
2
'Coding Test' 카테고리의 다른 글
[CT - 프로그래머스] 의상 (0) | 2023.10.26 |
---|---|
[CT - 프로그래머스] 전화번호 목록 (0) | 2023.10.23 |