Jerry's Bakery

[알고리즘] 신고 결과 받기(프로그래머스) 본문

알고리즘

[알고리즘] 신고 결과 받기(프로그래머스)

_Jerry 2022. 3. 14. 16:38

문제 링크

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

코드

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
    var dic = [String:Int]()
    var reportList: [[String]] = Array(repeating: [], count: id_list.count)
    var result = Array(repeating: 0, count: id_list.count)
    
    for i in id_list.indices {
        dic.updateValue(i, forKey: id_list[i])
    }
    
    let set = Set(report)
    let array = Array(set)
    array.forEach {
        let data = $0.split(separator: " ").map{ String($0) }
        let from = data[0]
        let to = data[1]
        reportList[dic[to]!].append(from)
    }
    
    reportList.forEach {
        if $0.count >= k {
            $0.forEach {
                result[dic[$0]!] += 1
            }
        }
    }
    
    return result
}

풀이

딕셔너리를 이차원 배열의 인덱스로 활용했습니다.

var dic = [String:Int]()

for i in id_list.indices {
    dic.updateValue(i, forKey: id_list[i])
}

입력된 id_list가 ["muzi", "frodo", "apeach", "neo"] 였을 때 아래처럼 인덱스를 딕셔너리의 value값에 에 할당했습니다.

 

key muzi frodo apeach neo
value 0 1 2 3

 

유저에게 신고한 유저 정보를 담고 있는 2차원 배열을 선언합니다.

var reportList: [[String]] = Array(repeating: [], count: id_list.count)

 

각 유저는 한 번에 한 명의 유저를 신고할 수 있기 때문에 Set을 사용해 중복을 제거합니다.

그 후 각 유저에게 신고한 사람들을 추가합니다.

 

let set = Set(report)
let array = Array(set)
array.forEach {
    let data = $0.split(separator: " ").map{ String($0) }
    let from = data[0]
    let to = data[1]
    reportList[dic[to]!].append(from)
}

만약 report 배열이 ["muzi frodo", "apeach frodo", "frodoneo", "muzineo", "apeachmuzi"]와 같다면 reportList 배열은 아래와 같은 결과가 나오게 될 것입니다.

 

신고받은 유저 신고한 유저
muzi[0] apeach  
frodo[1] muzi apeach
apeach[2]    
neo[3] frodo muzi

 

그 후 결괏값을 리턴하는 array 배열 선언 후 reportList를 순회하면서 k번 이상 신고를 당한 유저가 있다면 메일을 받도록 result배열에 추가합니다.

var result = Array(repeating: 0, count: id_list.count)

reportList.forEach {
    if $0.count >= k {
        $0.forEach {
            result[dic[$0]!] += 1
        }
    }
}

만약 k가 2라면 frodo와 neo는 각각 2번 신고를 받았기 때문에 frodo와 neo에게 신고한 muzi, apeach frodo가 메일을 받게 될 것이고, result 배열은 [2, 1, 1, 0]이 될 것입니다.

 

 

Comments