본문 바로가기
프로그래머스/Python

[프로그래머스] 베스트앨범 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 10. 20.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 노래를 기준에 따라 정렬하고 이를 바탕으로 장르별 최대 2곡까지 노래의 고유번호를 저장하는 문제이다.

우선 고유번호는 노래의 전체 재생 수가 많은 장르가 우선적으로 저장된다.

장르 내에서는 각 노래의 재생 수가 많은 노래부터 저장된다.

각 노래의 재생 수가 동일하면 고유번호가 낮은 것부터 저장된다.

이를 만족하기 위해 고유번호를 낮은 번호부터 불러와 딕셔너리에 각 장르별로 분류하고, 전체 재생 횟수도 저장한다.

이후 저장 기준에 따라 딕셔너리들을 정렬하고 고유번호를 추가하면 된다.

 

  1. 장르별 노래의 고유번호와 재생 수를 저장할 딕셔너리를 생성한다. d = {}
  2. 장르별 총 재생 횟수를 저장할 딕셔너리를 생성한다. total = {}
  3. 노래의 고유번호를 불러오며 for i in range(len(genres))
  4. 만약 해당 장르가 딕셔너리에 있으면 if (genres[i] in d)
  5. 해당 장르에 노래의 재생 수와 고유번호를 리스트로 만들어 추가한다. d[genres[i]].append([plays[i], i])
  6. 반면에 해당 장르가 딕셔너리에 없으면 else
  7. 해당 장르의 값을 리스트로 하여 노래의 재생 수와 고유번호를 리스트로 저장한다. d[genres[i]] = [[plays[i], i]]
  8. 만약 해당 장르가 전체 재생 수 딕셔너리에 있으면 if (genres[i] in total)
  9. 해당 장르에 노래의 재생 수를 더해준다. total[genres[i]] += plays[i]
  10. 반면에 해당 장르가 딕셔너리에 없으면 else
  11. 해당 장르에 노래의 재생 수를 저장한다. total[genres[i]] = plays[i]
  12. 장르별 전체 재생 횟수를 저장한 딕셔너리를 키와 값으로 묶어 리스트로 저장한다. li = list(total.items())
  13. 전체 재생 횟수를 기준으로 내림차순 정렬한다. li.sort(key = lambda x : x[1], reverse=True)
  14. 해당 리스트의 원소를 하나씩 불러오며 for i in li
  15. 해당 장르의 정보를 딕셔너리에서 불러온다. v = d.get(i[0])
  16. 불러온 정보는 노래의 재생 수와 고유번호를 리스트로 묶은 2차원 리스트의 형태인데, 이를 재생 수를 기준으로 내림차순 정렬을 한다. v.sort(key = lambda x : x[0], reverse=True)
  17. 노래의 고유번호를 저장할 인덱스 변수를 생성하고 초기화한다. j = 0
  18. 최대 2개까지 저장 가능하므로 2개 이전이거나, 전체 노래의 개수가 개수보다 크면(추가할 노래가 있으면) 반복한다. while (j < 2) and (len(v) > j)
  19. 정답 리스트에 노래의 고유번호를 추가한다. answer.append(v[j][1])
  20. 인덱스를 증가시켜 다음 노래를 불러오도록 한다. j += 1
반응형

3. 소스코드

def solution(genres, plays):
    answer = []
    
    d = {}
    total = {}
    for i in range(len(genres)):
        if (genres[i] in d):
            d[genres[i]].append([plays[i], i])
        else:
            d[genres[i]] = [[plays[i], i]]
            
        if (genres[i] in total):
            total[genres[i]] += plays[i]
        else:
            total[genres[i]] = plays[i]
            
    li = list(total.items())
    li.sort(key = lambda x : x[1], reverse=True)
    for i in li:
        v = d.get(i[0])
        v.sort(key = lambda x : x[0], reverse=True)
        j = 0
        while (j < 2) and (len(v) > j):
            answer.append(v[j][1])
            j += 1
    
    return answer
728x90
반응형