요구능력 : 딕셔너리의 활용
코드설명 :
문제를 풀어봤는데 O(n^2)으로 풀어서 몇개의 테스트케이스에서 시간초과가 나왔다.
신고자와 피신고자의 이름을 맞추다가 시간초과가 난것이다.
이 부분에서 생각을 잘 해야되는데,
Dictioary의 특성상 키는 중복되지 않는다.
그리고 신고한사람이 자신이 신고한사람의 목록을 갖고있어봐야 소용이없다.
그래서 피신고자(신고당한사람)가 신고자를 Dictionary에 저장하고 자신을 신고한 사람이 k명이 넘을경우,
자신을 신고한 사람에 1씩 더해줌으로써 경고메일을 표현해준다.
이 문제는 이게 핵심이다.
for i in toDict{
if i.value.count >= k {
for v in i.value{
receiveDict[v]! += 1
}
}
후기 : 커다란 사고가 필요하다기 보다는 발상의전환(?)이 필요한 문제같았다.
func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
var reportSet = Set<String>()
var receiveDict = [String: Int]() //이름 : 메일받은횟수저장
var toDict = [String: [String]]() //누가 누구한테 신고당했는지 저장
var result = [Int]()
for i in report {
reportSet.insert(i)
}
for i in id_list{
receiveDict[i] = 0
toDict[i] = []
}
for i in reportSet{
let a = i.split(separator: " ").map{String($0)}
toDict[a[1]]?.append(a[0])
}
for i in toDict{
if i.value.count >= k {
for v in i.value{
receiveDict[v]! += 1
}
}
}
for i in id_list{
for (key, value) in receiveDict{
if key == i{
result.append(value)
}
}
}
return result
}
'Algorithm > 문제풀이_프로그래머스' 카테고리의 다른 글
[Swift][프로그래머스][LV_2] 양궁대회 (0) | 2022.02.22 |
---|---|
[Swift][프로그래머스][LV_2] 주차 요금 계산 (0) | 2022.02.21 |
[Swift][프로그래머스][LV_1] 예산 (0) | 2021.11.19 |
[Swift][문자열][LV_2][프로그래머스] 영어 끝말잇기 (0) | 2021.11.19 |
[Swift][문자열][LV2][프로그래머스] 스킬트리 (0) | 2021.11.18 |
댓글