-
[programmers/Swift] 베스트앨범Archive/Questions 2022. 8. 5. 16:37728x90
programmers.co.kr - 코딩테스트연습 - Lv.3 - 해시 - 베스트앨범
Constraints :
- genres[i]는 고유번호가 i인 노래의 장르입니다.
- plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
- genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
- 장르 종류는 100개 미만입니다.
- 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
- 모든 장르는 재생된 횟수가 다릅니다.
// // Created by Yongwoo Marco on 2022/08/04. // Copyright © 2022 Yongwoo Marco Kim. All rights reserved. // func solution(_ genres:[String], _ plays:[Int]) -> [Int] { let filteredGenres = Array(Set(genres)) var playCount = Dictionary( uniqueKeysWithValues: zip(filteredGenres, [Int]( repeating: 0, count: filteredGenres.count)) ) var table = Dictionary( uniqueKeysWithValues: zip(filteredGenres, [[(Int, Int)]]( repeating: [(0, 0), (0, 0)], count: filteredGenres.count)) ) for (index, genre) in genres.enumerated() { let play = plays[index] let bests = table[genre]! if let first = bests.first, play > first.1 { table[genre]?[1] = first table[genre]?[0] = (index, play) } else if let last = bests.last, play > last.1 { table[genre]?[1] = (index, play) } playCount[genre] = (playCount[genre] ?? 0) + play } return playCount.sorted { $0.value > $1.value } .map { table[$0.key]!.filter { $0.1 != 0 } } .flatMap { $0 } .map { $0.0 } } print(solution( ["classic", "pop", "classic", "classic", "pop"], [500, 600, 150, 800, 2500]) ) // [4, 1, 3, 0]
How I tried this :
한번에 통과되었지만 코드가 지저분해서 아쉽다.playCount 를 두고 순서를 체크하고,
table 에 각 장르는 반드시 두 곡을 배열로 갖는다.
반환값에서 두 곡 중 재생수가 0 (초기값) 인경우를 제외시키고 (filter)
반환값에서는 튜플의 0번째 값 (index)만 반환되도록 처리 (map)
What I got is :
일단 구현해내는걸 목표로 잡았다..문제에 관한 모든 저작권 : https://programmers.co.kr/
728x90'Archive > Questions' 카테고리의 다른 글
[programmers/Swift] 단어 변환 (0) 2022.08.12 [programmers/Swift] 이진 변환 반복하기 (0) 2022.08.06 [programmers/Swift] 신고 결과 받기 (2022 Kakao Blind Recruitment) (0) 2022.08.04 [programmers/Swift] 점프와 순간 이동 (0) 2022.06.02 [programmers/Swift] 스킬트리 (0) 2022.06.01