난이도 : Lv 2
분류 : 해시
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import Foundation
func solution(_ genres: [String], _ plays: [Int]) -> [Int] {
var playCountByGenre = [String: Int]()
// 각 장르별로 총 재생 횟수를 저장하는 딕셔너리
var songPlayCountByGenre = [String: [(id: Int, playCount: Int)]]()
// 각 장르별로 노래의 고유 번호와 재생 횟수를 저장하는 배열
for i in 0..<genres.count {
let genre = genres[i]
let playCount = plays[i]
playCountByGenre[genre, default: 0] += playCount
// 재생 횟수를 장르별로 누적
songPlayCountByGenre[genre, default: []].append((id: i, playCount: playCount))
// 해당 장르에 노래 정보를 추가
}
let sortedGenres = playCountByGenre.keys.sorted { playCountByGenre[$0]! > playCountByGenre[$1]! }
// 총 재생 횟수가 많은 장르부터 정렬된 배열
return sortedGenres.flatMap { genre in
songPlayCountByGenre[genre]!.sorted(by: { $0.playCount == $1.playCount ? $0.id < $1.id : $0.playCount > $1.playCount }).prefix(2).map { $0.id }
// 각 장르에서 노래를 재생 횟수로 내림차순 정렬하고, 최대 2곡까지 선택하여 반환
}
}
풀이
1. Dictionary 를 사용해서 장르별 총 재생 횟수와 노래의 재생 횟수를 저장한다.
2. 장르별 총 재생 횟수가 많은 순서로 정렬된 목록을 만든다.
3. flatMap 을 사용해서 목록을 배열로 변환하고, 해당 장르의 노래 목록을 재생 횟수 내림차순으로 정렬한 뒤 2곡을 선택해서 반환한다.
4. sorted 함수에서는 재생 횟수가 같을 경우 ID 를 비교해서 오름차순으로 정렬한다.
P.S
처음 풀 때 for 문을 남발해서 시간초과가 났고, 생각을 다르게 해서 간결하게 해결했던 문제이다.
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 괄호 회전하기 (0) | 2023.03.07 |
---|---|
[프로그래머스] 타겟 넘버 (0) | 2023.02.22 |
[프로그래머스] 위장 (0) | 2023.02.21 |
[프로그래머스] 다리를 지나는 트럭 (0) | 2023.02.17 |
[프로그래머스] 프린터 (0) | 2023.02.17 |