Algorithm Problem Solving/Programmers

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 뉴스 클러스터링 with Swift

코코자장자장 2021. 12. 31. 15:45

안녕하세요. 오늘은 프로그래머스 2레벨 문제 뉴스클러스터링 문제를 풀어볼게요!

뉴스 클러스터링은 Set을 사용하여 교집합과 합집합을 사용할 줄 알면 되는 문제입니다!

 

우선 문제에서 대소문자에 대해서 같다고 하였으니 uppercased혹은 lowercased 프로퍼티를 사용하여줍니다!

 

그리고 str1과 str2의 Set을 만들어주면 되는데요!

 

중복된 string을 허용한다고 했으나 Swift의 Set에서는 중복이 허용되지 않습니다!

 

var i:Int = 0

while true {
    result = String(c1) + String(c2) + String(i)
    i += 1
    if !stringSet.contains(result) {
        stringSet.insert(result)
        break
    }
}

이를 방지하기 위해 위와 같은 방법으로 뒤에 인덱스를 붙여줍니다!

 

그럼 모든 string뒤에 index가 붙어있어 중복이 구별됩니다!

 

이렇게해서 교집합을 합집합으로 나눠주면 문제를 해결할 수 있습니다!

 

import Foundation

func makeStringSet(_ string:String) -> Set<String> {
    var stringSet:Set<String> = Set<String>()
    for i in 1..<string.count {
        var c1 = string[string.index(string.startIndex, offsetBy: i-1)]
        var c2 = string[string.index(string.startIndex, offsetBy: i)]
        
        if !c1.isLetter || !c2.isLetter {
            continue
        }
        
        var result = ""
        var i:Int = 0
        
        while true {
            result = String(c1) + String(c2) + String(i)
            i += 1
            if !stringSet.contains(result) {
                stringSet.insert(result)
                break
            }
        }
    }
    return stringSet
}

func solution(_ str1:String, _ str2:String) -> Int {
    var string1 = str1.lowercased()
    var string2 = str2.lowercased()
    var stringSet1 = makeStringSet(string1)
    var stringSet2 = makeStringSet(string2)
    
    if stringSet1.union(stringSet2).count == 0 {
        return 65536
    }
    
    var Ratio = Double(stringSet1.intersection(stringSet2).count) / Double(stringSet1.union(stringSet2).count)
    
    return Int(Ratio * 65536)
}

 

오늘은 여기까지이며 모르는 부분이 있으면 항상 질문해주시면 답변해드리겠습니다.

 

감사합니다!