안녕하세요. 오늘은 프로그래머스 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)
}
오늘은 여기까지이며 모르는 부분이 있으면 항상 질문해주시면 답변해드리겠습니다.
감사합니다!
'Algorithm Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 2020 카카오 인턴십 수식 최대화 with Swift (0) | 2022.01.02 |
---|---|
[프로그래머스] 2021 카카오 채용연계형 인턴십 거리두기 확인하기 with Swift (0) | 2021.12.31 |
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 괄호 변환 with Swift (0) | 2021.12.27 |
[프로그래머스] 2021 KAKAO BLIND RECRUITMENT 메뉴 리뉴얼 with Swift (0) | 2021.12.24 |
[프로그래머스] 코딩테스트 연습 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 행렬 테두리 회전하기 with Swift (0) | 2021.12.22 |