[알고리즘] Swift -프로그래머스 연습문제 #92334(2022 카카오 블라인드_신고 결과 받기)

2023. 5. 28. 22:47ALGORITHM/Swift

728x90
반응형

 

문제링크

 

 

 

 

분석

게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 한다.

각 유저는 1번에 1명의 유저를 신고할 수 있다.

신고 횟수는 제한이 없다. 서로 다른 유저를 계속 신고할 수 있다.

한 유저를 여러 번 신고할 수 있지만 동일한 유저에 대한 신고 횟수를 1회로 처리된다.

k번 이상 신고된 유저는 게시판 이용이 정지되며 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송한다.

유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정리를 시키면서 정지 메일을 발송한다.

이용자의 아이디가 담긴 배열, 각 이용자가 신고한 이용자의 아이디가 담긴 배열, 정지 기준이 되는 신고 횟수가 주어질 때 유저별로 처리 결과 메일을 받은 횟수를 리턴하는 문제이다.

 

id_list에는 같은 아이디가 중복해서 들어있지 않다.

report의 원소는 "이용자아이디 신고한아이디"의 형태이다. 자기 자신을 신고하는 경우는 없다.

 

풀이 과정

한 유저가 여러번 같은 유저를 신고해도 1번으로 처리되기 때문에 Set을 이용하여 동일한 신고는 제거한다.

var userDic = [String : [String]]()
var dic = [String : Int]()

for rep in Set(report) {
    let arr = rep.split(separator: " ").map { String($0) }
    userDic[arr[0]] = (userDic[arr[0]] ?? []) + [arr[1]]
    dic[arr[1]] = (dic[arr[1]] ?? 0) + 1
}

userDic은 이용자 아이디별로 신고한 아이디를 저장한다.

dic은 신고당한 아이디가 신고당한 횟수를 저장한다.

 

 

 

 

 

풀이

import Foundation

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
    
    var userDic = [String : [String]]()
    var dic = [String : Int]()
    var result = Array(repeating: 0, count: id_list.count)
    
    for rep in Set(report) {
        let arr = rep.split(separator: " ").map { String($0) }
        userDic[arr[0]] = (userDic[arr[0]] ?? []) + [arr[1]]
        dic[arr[1]] = (dic[arr[1]] ?? 0) + 1
    }
    
    for i in 0..<id_list.count {
        for arr in userDic[id_list[i]] ?? [] {
            if dic[arr] ?? 0 >= k {
                result[i] += 1
            }
        }
    }
    
    return result
}

 

결과

//print(solution( ["muzi", "frodo", "apeach", "neo"]           , ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]         , 2))

print(solution( ["con", "ryan"]        , ["ryan con", "ryan con", "ryan con", "ryan con"]      , 3))

 

 

 


📂  정리

배열을 Set으로 형변환하게 되면 Set의 속성인 중복된 요소를 제거할 수 있다.

 

 

 

 

728x90
반응형