프로그래머스 뉴스 클러스터링

quokka·2024년 5월 12일
0

코딩테스트

목록 보기
61/63

문제링크: https://school.programmers.co.kr/learn/courses/30/lessons/17677

str1과 str2의 자카드 유사도를 구하는 문제입니다. 문자열의 연속적인 2개의 문자를 비교하여 중복을 허용하는 교집합, 합집합을 구해야합니다. 공집합인 경우는 1로 정의합니다. 공집합은 집합이 비어있다는 의미로, 교집합 != 공집합이 아닙니다. 문제를 풀때 이 케이스에서 애를 먹었던거같습니다.

문제 KeyPoint
1. 서로 같은 문자가 있는지 확인하기 위해서 A배열을 foreach로 돌면서 B배열에 해당값이 존재하는지 확인하여 있다면 B배열에서 해당 문자를 제거 해주었습니다.
2. 영문자만 허용하기 때문에 CharacterSet을 이용하여 영문자가 포함되어있는지 확인하였습니다.
3. 교집합 합집합이 일때만 해당 연산을 해주고 나머지는 공집합 연산을 해주었습니다.

import Foundation
func solution(_ str1:String, _ str2:String) -> Int {
    var str1SubsetArray = [String]()
    var str2SubsetArray = [String]()
    var intersectionCount = 0
    var result: Double = 1
    
    for index in 0..<str1.count - 1 {
        let startIndex = str1.index(str1.startIndex, offsetBy: index)
        let endIndex = str1.index(startIndex, offsetBy: 1)
        let subset = String(str1[startIndex...endIndex]).lowercased()
        if !containsWhitespaceOrSpecialCharacter(subset) {
            str1SubsetArray.append(subset)
        }
    }
    
    for index in 0..<str2.count - 1 {
        let startIndex = str2.index(str2.startIndex, offsetBy: index)
        let endIndex = str2.index(startIndex, offsetBy: 1)
        let subset = String(str2[startIndex...endIndex]).lowercased()
        if !containsWhitespaceOrSpecialCharacter(subset) {
            str2SubsetArray.append(subset)
        }
    }
    
    str1SubsetArray.forEach {
        if let findIndex = str2SubsetArray.firstIndex(of: $0) {
            str2SubsetArray.remove(at: findIndex)
            intersectionCount += 1
        }
    }
    
    let unionCount = str1SubsetArray.count + str2SubsetArray.count
    if intersectionCount > 0 || unionCount > 0 {
        result = Double(intersectionCount) / Double(unionCount)
    }
    return Int(floor(result * 65536))
}

func containsWhitespaceOrSpecialCharacter(_ string: String) -> Bool {
    let whitespaceAndSpecialCharacterSet = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyz").inverted
    return string.rangeOfCharacter(from: whitespaceAndSpecialCharacterSet) != nil
}
profile
iOS를 공부하는 개발자입니다~ㅎㅎ

0개의 댓글

관련 채용 정보