프로그래머스 - 뉴스 클러스터링(Lv. 2)

OQ·2022년 3월 9일
0

프로그래머스

목록 보기
15/33

문제 링크

풀이

func solution(_ str1:String, _ str2:String) -> Int {
    let seperatedStr1 = seperate(str1)
    let seperatedStr2 = seperate(str2)
    
    let similarity = getSimilarity(seperatedStr1, seperatedStr2)
    return Int(similarity * 65536)
}

// 문자 2글자씩 끊어서 분리
func seperate(_ str: String) -> [String] {
    var result: [String] = []
    let strArr = str.map { String($0).uppercased() }
    
    for index in 0..<(strArr.count - 1) {
        let word1 = strArr[index]
        let word2 = strArr[index + 1]
        if word1 >= "A" && word1 <= "Z"
           && word2 >= "A" && word2 <= "Z" {
                result.append(word1 + word2)
            }
    }
    
    return result
}

// 교집합, 합집합 찾은 후 유사도 리턴
func getSimilarity(_ arr1: [String], _ arr2: [String]) -> Double {
    var intersection: [String] = []
    var union = arr2
    
    var temp = arr2 // 교집합에 같은 문자열이 여러번 들어가는걸 배제하기위한 변수
    for arg in arr1 {
        if temp.contains(arg) {
            if let removeIndex = temp.firstIndex(of: arg) {
                temp.remove(at: removeIndex)
            }
            intersection.append(arg)
        } else {
            union.append(arg)
        }
    }
    
    if intersection.count == 0 {
        // 집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의한다.
        // 이 부분에서 또 특이한점이 교집합 합집합 둘다 빈배열일 경우도 공집합으로 친다.
        if union.count == 0 {
            return 1
        }
        
        // 교집합이 없는 경우는 유사도 제로
        return 0
    }
    
    return Double(intersection.count) / Double(union.count)
}

후기

배열로 교집합 합집합 구하기 문제.
특별히 어려울 건 없었다. 지문에서 설명이 부족한 부분이 있었지만...

profile
덕업일치 iOS 개발자

0개의 댓글