Swift) 2018 KAKAO BLIND RECRUITMENT - 뉴스 클러스터링

https://school.programmers.co.kr/learn/courses/30/lessons/17677#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

합집합, 교집합만 올바르게 구현 할 수 있다면 쉬운 문제. 집합에서 동일한 원소값 여럿 있다면, 교집합의 경우  제일 적은 집합의 수만큼 넣고, 합집합의 경우 가장 많은 수만큼 넣는다. 한쪽에만 동일한 여러개의 원소가 있는 경우에도, 이때 상대에게 0개가 있는것으로 치니 한쪽의 수만큼 넣어야 한다. 해설을 보면 병합정렬을 응용하면 쉽게 구현할 수 있다던데, 한번 알아봐야겠다.

 

소요시간: 50분

import Foundation

func makeTuple(_ str: String) -> [String] {
    var answer: [String] = []
    let arrStr = Array(str)
    for s in 0..<arrStr.count-1 {
        let first = arrStr[s]
        let second = arrStr[s+1]
        
        if !first.isLetter || !second.isLetter {
            continue
        }
        answer.append("\(first.uppercased())\(second.uppercased())")
    }
    return answer
}

func makeDict(_ str: [String]) -> [String: Int] {
    var dict: [String: Int] = [:]
    for s in str {
        if dict[s] != nil {
            dict[s]! += 1
        } else {
            dict[s] = 1
        }
    }
    return dict
}

func makeGyo(_ s1: [String], _ s2: [String]) -> [String] {
    let s1Dict = makeDict(s1)
    let s2Dict = makeDict(s2)
    var gyo: [String] = []
    
    for i in s1Dict {
        if s2Dict[i.key] != nil {
            gyo.append(i.key)
        }
    }
    for i in gyo {
        let addNum = min(s1Dict[i]!, s2Dict[i]!)
        for _ in 1..<addNum {
            gyo.append(i)
        }
    }
    return gyo
}

func makeHap(_ s1: [String], _ s2: [String]) -> [String] {
    let s1Dict = makeDict(s1)
    let s2Dict = makeDict(s2)
    var allArr: [String] = []
    allArr.append(contentsOf: s1)
    allArr.append(contentsOf: s2)
    var hap = Array(Set(allArr))
    
    for i in hap {
        if s1Dict[i] != nil && s2Dict[i] != nil {
            let addNum = max(s1Dict[i]!, s2Dict[i]!)
            for _ in 1..<addNum {
                hap.append(i)
            }
        } else if s1Dict[i] == nil {
            for _ in 1..<s2Dict[i]! {
                hap.append(i)
            }
        } else if s2Dict[i] == nil {
            for _ in 1..<s1Dict[i]! {
                hap.append(i)
            }
        }
    }
    return hap
}

func solution(_ str1:String, _ str2:String) -> Int {
    let firstTuple = makeTuple(str1)
    let secondTuple = makeTuple(str2)
    if firstTuple.count == 0 && secondTuple.count == 0 {
        return 65536
    }
    let gyo = makeGyo(firstTuple, secondTuple)
    let hap = makeHap(firstTuple, secondTuple)
    
    print(gyo)
    print(hap)
    
    return Int(floor((Double(gyo.count) / Double(hap.count)) * 65536.0))
}