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

Zion·2022년 1월 23일
3

문제링크
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
}
profile
어제보다만 나아지는

0개의 댓글