본문 바로가기
알고리즘

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

by 코코종 2022. 3. 15.
728x90

안녕하세요 코코종입니다. 알고리즘 스터디 그 두번째..! 작년 추석쯤에 응시했던 카카오 블라인드 문제였네요.

그때는 좀 어려웠던거 같은데... (파이썬으로 풀기는 했지만 끝까지 풀지는 않고 거의 80퍼까지만 맛보기로 풀었네요)

기억을 더듬어 보면 딕셔너리를 사용하지 않고 그냥 배열에 때려넣고 했던거 같네요 ㅎㅎ... 외쳐 파이썬 채고!!

https://programmers.co.kr/learn/courses/30/lessons/92334

 

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

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

programmers.co.kr

import Foundation

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
    
    // 동일 유저 신고는 1회처리
    // k번 이상 신고된 유저는 정지, 신고한 모든 유저에게 정지 사실을 이메일 발송
    // 신고 내용을 모두 취합후 한번에 발송
    
    // [신고 받은 사람 : 횟수]
    var dict: [String : Int] = [:]
    id_list.forEach {
       dict[$0] = 0
    }
    
    var setReport = Set(report)
    
    for rep in setReport {
        let splited = rep.components(separatedBy: " ")
        let reportFrom = splited[0]
        let reportTo = splited[1]
        dict[reportTo]! = dict[reportTo]!+1
    }
    
    var result: [Int] = Array(repeating: 0, count: id_list.count)
    
    for rep in setReport {
        let splited = rep.components(separatedBy: " ")
        let reportFrom = splited[0]
        let reportTo = splited[1]
        if dict[reportTo]! >= k { // 신고 받은 횟수가 k번 이상이라면
            result[id_list.index(of: reportFrom)!] += 1
        }

    }
    // print(result)
    // print(dict)
    
    return result
}

 


 

이제 코드에 가볍게 설명을 적어뒀습니다. 간단하게 설명을 하자면

먼저 중복되는 신고를 처리해주고 배열을 돌면서 dictionary에 해당 유저의 신고 횟수를 저장하고 다시 배열을 돌면서 해당 인원의 신고 횟수가 k번 이상이라면 result배열의 해당 인덱스를 찾아서 값을 올려주는 방식으로 했습니다. 

 

다른 스터디원분들의 풀이도 비슷했는데 저는 10초 제한 중 제일 오래 걸리는게 거의 9초에 가까웠는데 훨씬 빠른 분들도 있더라구요! 그래서 자세히 들여다보니 배열에 인덱스로 접근하지 않고 딕셔너리를 활용하셨더라구요.. 배열은 시간 복잡도가 O(n)이다보니 좀 더 느리지 않았나 생각합니다! 계속 느려봐~~ 통과하면 그만이야~~

 

여담으로 요새 할 일이 너무 많네여... 그래도 꾸준하게 글 작성하겠습니다!! 그럼 이만!

728x90