알고리즘/알고리즘 문제풀이

해쉬_Programmgers_베스트앨범 [swift]

Downey 2024. 8. 22. 21:31

 

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

 

프로그래머스

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

programmers.co.kr

 

요구사항

  1. 장르의 재생 수 순위
  2. 장르 내 노래의 재생 수 순위
  3. 장르 순위 순서로 장르 내 노래 순위 순서로 2개를 뽑음.
  4. 노래의 plays가 같다면 id로 정렬

노래가 2개니까 비교가 쉽다..

 

코드 중 appendee의 sorted 구문은 plays비교조건만 있을 때에도 채점 시 전부 정답이 되었다.

생각해보면, id 순서대로 dic 내 Array에 추가되고, 정렬 시, 큰 element가 앞쪽으로 이동하므로, id가 작은 element가 앞쪽에 있기 때문이다.

 

추가해서 사용한 테스트 케이스

genres(string[]) : ["q", "q", "q", "p", "p", "p"]

plays(int[]) : [100, 200, 300, 100, 100, 150]

Return : [2, 1, 5, 3]

import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    var musics = [String: [Music]]()
    var genrePlayCount = [String: Int]()
    
    var sol = [Int]()
    
    for (index, genre) in genres.enumerated() {
        if musics[genre] == nil {
            musics[genre] = [Music(id: index, plays: plays[index])] 
        } else {
            musics[genre]?.append(Music(id: index, plays: plays[index]))
        }
        
        if genrePlayCount[genre] == nil {
            genrePlayCount[genre] = plays[index]
        } else {
            genrePlayCount[genre] = plays[index] + genrePlayCount[genre]!
        }
    }
    
    let sorted = genrePlayCount.sorted { $0.value > $1.value }
    
    for (key, value) in sorted {
        let appendee = musics[key]!.sorted { 
            $0.plays > $1.plays 
        }.prefix(2).map { $0.id }
        sol.append(contentsOf: appendee)
    }
    
    return sol
}

struct Music {
    let id: Int
    let plays: Int
}

 

더보기
채점을 시작합니다.
정확성 테스트
테스트 1 통과 (0.22ms, 16.5MB)
테스트 2 통과 (0.22ms, 16.2MB)
테스트 3 통과 (0.20ms, 16.4MB)
테스트 4 통과 (0.21ms, 16.4MB)
테스트 5 통과 (0.38ms, 16.4MB)
테스트 6 통과 (0.34ms, 16.5MB)
테스트 7 통과 (0.28ms, 16.5MB)
테스트 8 통과 (0.24ms, 16.5MB)
테스트 9 통과 (0.22ms, 16.4MB)
테스트 10 통과 (0.38ms, 16.3MB)
테스트 11 통과 (0.23ms, 16.5MB)
테스트 12 통과 (0.29ms, 16.3MB)
테스트 13 통과 (0.36ms, 16.4MB)
테스트 14 통과 (0.37ms, 16.5MB)
테스트 15 통과 (0.21ms, 16.1MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0