[Swift] 프로그래머스 - 신고결과 받기
문제링크
https://programmers.co.kr/learn/courses/30/lessons/92334
풀이
딕셔너리로 푼다.
왜안되냐 ... 프로그래머스 사이트 입구에 예쁘게 있어서 '야무지게 풀어야지 ~' 했는데 Test Case 3번에서 계속 시간초과가 떠서 좀 그랬다 😅
문제에서 설명한 풀이방식을 다르게 볼 수도 있어서
이부분을 역으로 사용해서 dictionary
를 만들어줬다.
즉 dict = [ 신고당한사람 : [신고자] ]
이런 형식으로 짰다.
그럼 나중에 신고당한사람 count세기도 쉬울거 같아서.
예제1의 dict 출력이다. 2(=k)명 이상이 신고했으면 불량이용자다.
frodo랑 neo를 신고한 사람들이 2명 이상이기때문에 검거다.
frodo랑 neo를 신고한 사람들에게 mail을 보내야한다.
Try1
for name in dict.keys {
if dict[name]!.count >= k {
for n in dict[name]! {
arr[id_list.firstIndex(of: n)!] += 1
}
}
}
count가 k이상이면 신고자들 array를 불러다 해당 신고자 index위치에 +1 을 해준다.
아? 근데 앞에 말했다시피 testCase3에서 자꾸 시간초과가 뜨는것이다.
생각해보니 firstIndex
가 좀 냄새가 났다.
이거 안쓰면 ? 이름도 id_list 의 index로 바꿔서 해줘야 하나 ?.......... 싶었는데
아아아 아아 ? ids = [name: index]
로 저장해줘서 firstIndex안해주면 된다.
메모리와 시간은 반비례랄까... 트레이드오프?... 이런관계인거같다.
Source Code
func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
var dict: [String: [String]] = [:]
var arr: [Int] = Array(repeating: 0, count: id_list.count)
var ids: [String: Int] = [:]
// 이름에 해당하는 index dictionary 생성
for (index, id) in id_list.enumerated() {
ids[id] = index
}
// [ 신고당한사람 : [신고자] ]
for repo in report {
let arr = repo.split(separator: " ").compactMap { String($0) }
let name = arr[1]
let singo = arr[0]
if dict[name] == nil {
dict.updateValue([singo], forKey: name)
} else {
if !dict[name]!.contains(singo) {
dict[name]!.append(singo)
}
}
}
for name in dict.keys {
if dict[name]!.count >= k {
for n in dict[name]! {
arr[ids[n]!] += 1
}
}
}
return arr
}
Author And Source
이 문제에 관하여([Swift] 프로그래머스 - 신고결과 받기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@heunb/Swift-프로그래머스-신고결과-받기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)