슈프림 블로그
[프로그래머스] 해시 - 베스트앨범 (Swift 풀이) 본문
먼저 조건을 살펴보았다.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
이 조건들을 살펴 보니, 각 장르별로 노래가 재생된 횟수를 모두 더한 값을 가지고 있는 딕셔너리가 하나 필요 할 것 같고
그 횟수에 따라 가장 많이 재생된 장르부터 정렬된 배열이 필요할 것 같다.
그리고 장르별로 속한 노래가 무엇인지 저장하는 딕셔너리도 필요할 것 같다. 딕셔너리의 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
}
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 정렬 - H-Index (Swift 풀이) (0) | 2020.09.20 |
---|---|
[프로그래머스] 정렬 - K번째수 (Swift 풀이) (0) | 2020.09.20 |
[프로그래머스] 정렬 - 가장 큰 수 (Swift 풀이) (1) | 2020.09.19 |
[프로그래머스] 해시 - 위장 (Swift 풀이) (1) | 2020.09.01 |
[프로그래머스] 깊이/너비 우선 탐색(DFS/BFS) - 단어변환 (0) | 2020.07.15 |