신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
동일한 유저에 대한 신고 횟수는 1회로 간주한다 -> 중복되지 않게 정리
본인이 신고한 사람이 정지당했는지 -> 내가 신고한 사람이 누군지 기억
신고당한 사람이 정지 기준을 넘었는지 -> 신고당한 횟수 기억
중복되지 않는다는 것에서 Set떠올려 해당 타입을 이용했다. 이름을 key로 삼아 'data' 변수에 넣었다.
이후 정리한 데이터를 순회하며 각각 몇번 신고당했는지 'report_count' 변수에 넣었다.
이름이라는 key로 꺼내쓰기에 적합해보여 dictionary타입을 사용했다.
최종적으로 id_list 기준으로 순회하여 본인이 신고한 유저 중 정지 기준인 k를 넘어가는 유저가 몇명인지 세어 리턴해주었다.
import Foundation
func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
var data:[String:Set<String>] = [:]
var report_count:[String:Int] = [:]
for id in id_list {
data[id] = []
report_count[id] = 0
} //init
for re in report {
let id = re.split(separator:" ").map {String($0)}
data[id[0]]!.insert(id[1])
} //신고자별로 정렬
for i in data {
for j in i.value {
report_count[j]! += 1
}
} //유저별 신고당한 횟수
var result:[Int] = []
for id in id_list {
var temp = 0
for val in data[id]! {
if report_count[val]! >= k {
temp += 1
}
}
result.append(temp)
}
return result
}
참고자료
dictonary에 Subscript로([]) 접근하게되면 기본적으로 옵셔널 타입을 반환받게된다. 언래핑을 해주거나 default 값을 명시해야한다.
위 코드의 init부분이 없을 때 오류가 발생했다.
data[id[0]]!.insert(id[1]) 에서 접근이 불가능했다. 딕셔너리의 value가 Set이라서 발생하는 것으로 생각하고 id별로 초기화해주었다. 최초 선언할 때 = [:[]] 로 선언하는 문법은 왜 안되는걸까?