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)
}
배열로 교집합 합집합 구하기 문제.
특별히 어려울 건 없었다. 지문에서 설명이 부족한 부분이 있었지만...