(Swift) Programmers 베스트앨범

SteadySlower·2022년 9월 28일
0

Coding Test

목록 보기
169/305

코딩테스트 연습 - 베스트앨범

문제 풀이 아이디어

문제에서 시키는 그대로 구현하면 되는 문제입니다.

1번 조건인 “속한 노래가 많이 재생된 장르를 먼저 수록합니다.”를 구현하기 위해서 Dictionary를 사용해야 합니다. 장르의 이름은 String으로 제시되어 있고 재생 횟수는 Int이므로 [String : Int]를 사용하면 됩니다.

나머지 과정은 코드를 보면서 소개해드리도록 하겠습니다.

코드

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    // 장르별 플레이 횟수 세기
    func countPlaysPerGenres() -> [String : Int] {
        var result = [String : Int]()
        
        // 고유번호 i의 장르를 key에 고유번호 i의 재생횟수를 더한다.
        for i in 0..<genres.count {
            result[genres[i], default: 0] += plays[i]
            //👉 dictionary의 default가 이런 상황에 아주 유용!
        }
        
        return result
    }
    
    // 장르별 플레이 횟수
    let playsPerGenre = countPlaysPerGenres()
    
    // 결과를 저장할 배열
    var result = [Int]()
    
    // 장르의 key를 플레이 횟수의 내림차순으로 정렬해서 순회한다.
        //👉 조건 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
    for genre in playsPerGenre.keys.sorted(by: { playsPerGenre[$0]! > playsPerGenre[$1]! }) {
        var interim = [Int]()
        // 해당 장르에 속하는 노래의 고유번호(i)를 임시 배열에 저장
        for i in 0..<plays.count {
            if genres[i] == genre { interim.append(i) }
        }
        // 고유 번호들의 배열을 재생이 많은 순으로 정렬
            //👉 조건 2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
            //👉 조건 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. (이 배열은 이미 고유번호 순으로 정렬되어 있으므로 별도의 정렬 필요 없음)
        interim.sort(by: { plays[$0] > plays[$1] })
        // 만약에 해당 장르의 곡이 1개라면 1개만 노래에 담아야 함.
        let numOfSong = interim.count > 1 ? 2 : 1
        // 결과 배열에 상위 2곡만 담는다.
        result.append(contentsOf: interim[0..<numOfSong])
    }
    
    return result
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글