본문 바로가기
Algorithm/문제풀이_프로그래머스

[Swift][프로그래머스][LV_1] 신고결과받기

by Joahnee 2022. 2. 19.

요구능력 : 딕셔너리의 활용

 

코드설명 : 

 

문제를 풀어봤는데 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
}

 

댓글