나의 기록, 현진록

[Swift] 프로그래머스 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT [1차] 뉴스 클러스터링 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT [1차] 뉴스 클러스터링

guswlsdk 2022. 8. 23. 11:53
반응형

 

 

프로그래머스

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

programmers.co.kr

 

 

<문제풀이>

  1. 분리하기 - str1과 str2 두글자씩 분리하기
    • 대문자 또는 소문자 변환, 공백,  숫자, 특수문자, 두글자로 분해
  2. 분리된 str1과 str2으로 Set를 만들어 중복 없는 집합을 만듦
  3. 분리된 집합의 각 요소마다 str1, str2에 포함된 갯수를 구함
  4. 두 집합(str1, str2)에 포함된 갯수가 같을 경우, 다를 경우 교집합과 합집합에 추가할 요소가 다르게 구현
    •  갯수가 같을 경우 교집합, 합집합에 갯수만큼 추가
    •  갯수가 다를 경우 각 집합의 포함된 갯수의 최솟값 만큼은 교집합, 최대값 만큼 합집합에 추가
  5. 교집합 합집합이 모두 0일 때, 교집합은 0인데 합집합은 0이 아닐 떄, 그 이외 총 세가지의 경우에 대해서 리턴할 수 있도록 함

 

 

 

 

<코드>

func solution(_ str1:String, _ str2:String) -> Int {
    let str1 = str1.map{String($0.uppercased())}
    let str2 = str2.map{String($0.uppercased())}
    
    
    func makeSet(str: [String]) -> [String]{
        var d = [String]()
        for i in 0..<str.count-1{
            let temp = str[i] + str[i+1]
            if temp.range(of: "^[A-Z]{2,}", options: .regularExpression) != nil{
                d.append(temp)
            }
        }
        return d
    }
    func findCount(d: [String], w: String) -> Int{
        var count = 0
        for i in d{
            if i == w{
                count += 1
            }
        }
        return count
    }
    
    func compare(){
        for w in Set(d1+d2){
//            print(w)
            // d1, d2에 w가 몇 개 있는지
            let d1Count = findCount(d: d1, w: w)
            let d2Count = findCount(d: d2, w: w)
//            print(d1Count, d2Count)
            // 다중 집합일 때
            // 다중 집합 아닐 때
            if d1Count == d2Count {
                for _ in 0..<d1Count{
//                    print("d1==d2\(w)")
                    intersec.append(w)
                    union.append(w)
                }
                
            }else if d1Count > d2Count{
                for _ in 0..<d2Count{
                    intersec.append(w)
                }
                for _ in 0..<d1Count{
                    union.append(w)
                }
            }else if d1Count < d2Count{
                for _ in 0..<d2Count{
                    union.append(w)
                }
                for _ in 0..<d1Count{
                    intersec.append(w)
                }
            }
            
            
        }
    }
    let d1 = makeSet(str: str1)
    let d2 = makeSet(str: str2)
    
    var intersec = [String]()
    var union = [String]()
    
    compare()
    
    
//    print(intersec, union)
    if intersec.count == 0 && union.count == 0{
        return 65536
    }else if intersec.count == 0 && union.count != 0{
        return 0
    }else{
//        print(Double(intersec.count)/Double(union.count))
        return Int(Double(intersec.count)/Double(union.count) * 65536)
    }
}
반응형