상세 컨텐츠

본문 제목

[프로그래머스] 베스트앨범

Algorithm

by 쑤야. 2024. 1. 24. 17:30

본문

https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=swift

 

프로그래머스

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

programmers.co.kr

 

접근


  • 속한 노래가 많이 재생된 장르를 먼저 수록한다 → 딕셔너리를 활용하여 장르 별 재생 시간을 누적하여 정렬
  • 장르 내에서 많이 재생된 노래를 먼저 수록한다 / 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록한다 
    → 딕셔너리를 활용하여 동일한 장르끼리 그룹화하고, 튜플을 사용하여 인데스와 재생 횟수를 저장한다

 

로직


  • 장르 별 재생 누적시간을 구하고, 장르에 속하는 곡들을 (인덱스,재생시간)으로 모아준다
  • 재생 누적 시간을 기준으로 내림차순 정렬 해준다
  • 장르에 속한 곡들을 재생시간 내림차순 / 재생 번호 오름차순으로 정렬 해준다 
  • 장르 별 최대 2개의 곡만 answer에 넣어준다

 

코드


1. Python 풀이


딕셔너리 정렬에서 고생을 좀 했다. 조심하자.

  • 딕셔너리를 value 값 기준으로 정렬할 때는 items()를 활용해야 한다.
  • 딕셔너리를 key 값 기준으로 정렬할 때는 keys()를 활용해야 한다.
def solution(genres, plays):
    
    genre = {}
    totalPlay = {}
    
    # 장르 재생 총합을 기준으로 정렬한다
    for i, (g,p) in enumerate(zip(genres, plays)):
        if g not in totalPlay:
            totalPlay[g] = 0
            genre[g] = []
        totalPlay[g] += p
        genre[g].append([i, p])
    
    # 장르 별로 가장 많이 재생된 노래 2개씩만 넣는다
    answer = []
    for g in sorted(totalPlay.items(), key=lambda x:x[1], reverse=True):
        candidate = sorted(genre[g[0]], key=lambda x: (x[1], -x[0]), reverse=True)
        answer.append(candidate[0][0])
        if len(candidate) > 1:
            answer.append(candidate[1][0])
    
    return answer

 

2. Swift 풀이


import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {

    var totalPlay = [String:Int]()
    var genre = [String: [(Int, Int)]]() //장르: 인덱스, 재생 횟수
    for (i, (g, p)) in zip(genres, plays).enumerated() {
        if totalPlay[g] == nil {
            totalPlay[g] = 0
            genre[g] = []
        }
        totalPlay[g]! += p
        genre[g]!.append((i,p))
    }
    
    var answer = [Int]()
    for (g, _) in totalPlay.sorted(by: { $0.value > $1.value }) {
        let candidate = genre[g]!.sorted(by: { $0.1 == $1.1 ? $0.0 < $1.0 : $0.1 > $1.1 })
        answer.append(candidate[0].0)
        if candidate.count > 1 {
            answer.append(candidate[1].0)
        }
    }
    return answer
}

관련글 더보기