Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[프로그래머스] 해시 - 베스트앨범 (Swift 풀이) 본문

코딩테스트

[프로그래머스] 해시 - 베스트앨범 (Swift 풀이)

_슈프림 2020. 9. 11. 16:58
728x90

먼저 조건을 살펴보았다.

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

이 조건들을 살펴 보니, 각 장르별로 노래가 재생된 횟수를 모두 더한 값을 가지고 있는 딕셔너리가 하나 필요 할 것 같고

그 횟수에 따라 가장 많이 재생된 장르부터 정렬된 배열이 필요할 것 같다.

그리고 장르별로 속한 노래가 무엇인지 저장하는 딕셔너리도 필요할 것 같다. 딕셔너리의 value값은 id(Int)들을 저장하는 배열일 것이다.

 

playsByGenre: [String:Int]

[장르이름 : 해당 장르가 총 재생된 횟수]

- genres와 plays의 크기는 같다고 했으므로, 그 크기만큼 반복문을 순회한다

- 반복문 돌면서 얻은 genre를 key로 두고 play값을 value에 추가해준다.

 

bestGenre: [String]

[장르이름]

- playsByGenre의 value값이 큰 순서대로 정렬된 key값들을 들고 있는 배열

- playsByGenre.keys를 배열로 만들고, sorted 함수를 사용하여 playsByGenre의 value가 내림차순 형태가 되도록 key값을 정렬한다.

 

idsByGenre: [String:[Int]]

[장르이름 : [해당 장르에 포함된 노래의 id]]

- 아까 playsByGenre를 구하는 반복문에서 같이 처리해준다.

 

 

데이터를 정리할 구조는 완성이 되었으니, 어떻게 처리를 할 것인가??

- 장르 이름들은 다 bestGenre 배열에 많이 재생된 순서대로 정렬된 상태로 들어있다.

- 많이 재생된 장르의 노래를 먼저 수록해야 하므로 bestGenre를 순차적으로 탐색한다.

- bestGenre에서 뽑은 genre (즉, 많이 재생된 genre)를 key값으로, 해당 장르에 속한 id 배열을 구해 온다. idsByGenre에서 구할 수 있다.

- plays 배열에서 해당 id값에 있는 재생 횟수 값을 기준으로 내림차순 정렬 한다.

- 내림차순 정렬 된 배열에서 상위 2개의 id 값만 answer배열에 append 해준다.

import Foundation

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

    for i in 0..<genres.count {
        let genre = genres[i]
        let play = plays[i]

        if let pCount = playsByGenre[genre] {
            playsByGenre[genre] = pCount + play
        } else {
            playsByGenre[genre] = play
        }
        if idsByGenre[genre] != nil {
            idsByGenre[genre]!.append(i)
        } else {
            idsByGenre[genre] = [i]
        }
    }

    let bestGenre: [String] = Array(playsByGenre.keys).sorted{
        return playsByGenre[$0]! > playsByGenre[$1]!
    }

    var answer: [Int] = []
    for genre in bestGenre {
        let IDs = idsByGenre[genre]!.sorted{
            return plays[$0] > plays[$1]
        }
        answer.append(IDs[0])
        if IDs.count > 1 {
            answer.append(IDs[1])
        }
    }
    return answer
}
반응형
Comments