Skip to content

[Algorithm] [1차] 뉴스 클러스터링 #114

Closed
@hwangJi-dev

Description

@hwangJi-dev

💬 문제

[1차] 뉴스 클러스터링


💬 Idea

  1. 2개를 기준으로 문자열을 슬라이싱하며 정규표현식과 일치하지 않는 문자열은 건너띄고, 일치하는 문자열을 저장하여 반환한다.
  2. set으로 key값을 생성하여 key값을 돌면서 교집합과 합집합의 개수를 구한다.

💬 풀이

func solution(str1:String, str2:String) -> Int {
    let str1MultipleArr: [String] = sliceArr(Array(str1).map{ String($0) }, "^[a-z]+$")
    let str2MultipleArr: [String] = sliceArr(Array(str2).map{ String($0) }, "^[a-z]+$")
    let key = Set(str1MultipleArr + str2MultipleArr)
    
    var intersection: [String] = []
    var union: [String] = []
    
    for k in key {
        let s1 = str1MultipleArr.filter{ $0 == k }.count
        let s2 = str2MultipleArr.filter{ $0 == k }.count
        
        // 교
        if s1 != 0 && s2 != 0 {
            for _ in 0..<min(s1, s2) {
                intersection.append(k)
            }
        }
        
        // 합
        for _ in 0..<max(s1, s2) {
            union.append(k)
        }
    }
    
    if intersection.count == 0 && union.count == 0 {
        return 65536
    } else {
        return Int((Double(intersection.count) / Double(union.count) * 65536))
    }
}

func sliceArr(_ str: [String], _ regex: String) -> [String] {
    var arr: [String] = []
    for i in 0..<str.count - 1 {
        let s = str[i...i + 1].map{ String($0) }.joined().lowercased()
        
        if !s.allSatisfy({ $0.isLetter }) {
            continue
        }
        if s.range(of: regex, options: .regularExpression) == nil {
            continue
        }

        arr.append(s)
    }
    
    return arr
}

💬 더 나은 방법?

s.allSatisfy({ $0.isLetter }) 
  • 정규표현식을 사용하지 않고도 풀 수 있는 방법!
    • 분명 아는 문법이었는데 왜 풀때는 생각나지 않았는지.. ㅠ 반성해야겠다 !

💬 알게된 문법

func getArrayAfterRegex(regex: String) -> [String] {
        
        do {
            let regex = try NSRegularExpression(pattern: regex)
            let results = regex.matches(in: self,
                                        range: NSRange(self.startIndex..., in: self))
            return results.map {
                String(self[Range($0.range, in: self)!])
            }
        } catch let error {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }

[[Swift] Swift에서 정규표현식(Regular Expression)을 이용하기](https://eunjin3786.tistory.com/12)

  • 소수점 이하 나누는 방법 잊지 말 것…
    • Double(num1) / Double(num2)

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions