요구능력
딕셔너리의 활용 및 정렬
문제풀이
아래는 문제의 조건이다.
1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
1번을 처리하기 위해서 dict를 생성하고 ["classic": 1450]과 같이 저장하였다.
그리고 정렬해서 rankDict에 ["classic": 1]과 같이 저장하였다.
다음으로 2번을 처리하기 위해서 uniqueDict를 생성하고 [0 : ("classic", 500)]과 같이 저장하였다.
그리고 rankDict를 활용해서 장르별로 정렬을 해주었다.
이렇게 장르별로 정렬된 것은 sortedUniqueDict에 저장해주었고, sortedUniqueDict를 이제 재생된 노래의 내림차순으로 정렬하는데, 3번의 조건을 함께 처리해준다.
그리고 장르별 2개씩만 뽑도록 for문을 구성하였다.
후기
해시부분은 시간줄이는 연습만하면 될거같다.
코드
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
var dict = [String:Int]()
for i in genres{
dict[i] = 0
}
for i in 0..<genres.count{ //dict를 생성하고 ["classic": 1450]과 같이 저장
dict[genres[i]]! += plays[i]
}
let sortedDict = dict.sorted{$0.value > $1.value}
var rankDict = [String: Int]()//rankDict에 ["classic": 1]과 같이 저장
for i in 0..<sortedDict.count {
rankDict[sortedDict[i].key] = i
}
var uniqueDict = [Int: (String , Int)]()
for i in 0..<genres.count{//uniqueDict를 생성하고 [0 : ("classic", 500)]과 같이 저장
uniqueDict[i] = (genres[i], plays[i])
}
var sortedUniqueDict = uniqueDict.sorted{ //장르의 랭킹별로 정렬
rankDict[$0.value.0]! < rankDict[$1.value.0]!
}
sortedUniqueDict.sort{//장르가 같고 재생수 내림차순, 재생수가 같다면 고유번호 낮은순
if $0.value.0 == $1.value.0{
if $0.value.1 > $1.value.1{
return $0.value.1 > $1.value.1
}else if $0.value.1 == $1.value.1{
return $0.key < $1.key
}
}
return false
}
var result = [Int]()
var cnt = 0
var temp = sortedUniqueDict[0].value.0
for i in 0..<sortedUniqueDict.count{ //장르당 2개씩만.
if temp == sortedUniqueDict[i].value.0{cnt += 1}
else{
cnt = 1
}
if cnt <= 2{
result.append(sortedUniqueDict[i].key)
}
temp = sortedUniqueDict[i].value.0
}
return result
}
'Algorithm > 문제풀이_프로그래머스' 카테고리의 다른 글
[Swift][프로그래머스][완전탐색] 문자열 압축 (0) | 2022.04.21 |
---|---|
[Swift][프로그래머스][그리디] 체육복 (0) | 2022.04.20 |
[Swift][프로그래머스][완전 탐색] 카펫 (0) | 2022.04.18 |
[Swift][프로그래머스][완전 탐색] 소수 찾기 (0) | 2022.04.18 |
[Swift][프로그래머스][완전탐색] 모의고사 (0) | 2022.04.18 |
댓글