알고리즘 문제 풀이

[Swift] 프로그래머스 LV2. [1차] 뉴스 클러스터링

lgvv 2022. 4. 26. 17:43

프로그래머스 LV2. [1차] 뉴스 클러스터링

 

✅ 걸린시간 : 4:26 ~ 5:35 (약 1시간 10분)

처음으로 문제를 해결하는데 걸린시간 4:26 ~ 4:56(30분)

추가적으로 시간이 걸린 이유: 테스트케이스 4,7,9,10,11 실패

 

테스트 케이스 4,7,9,10,11 [반례]

str1: "BAAAA"
str2: "AAA"
answer: 32768

이 부분에서 봐야하는 점은 중복의 처리이다. 2글자씩 끊을 경우,

str1 = ["BA", "AA", "AA", ""AA"]

str2 = ["AA", ""AA"]

 

이렇게 나뉘게 된다. 여기에서 str1에는 AA가 3개 str2에는 AA가 2개이다. 따라서 중복은 2개가 되어야한다.

그런데 위의 테스트 케이스가 틀린 경우에는 이를 정확하게 처리하지 못하는 경우이다.

 

✅ 코드

//
//  p17677.swift
//  Algorithm
//
//  Created by Hamlit Jason on 2022/04/26.
//
//https://programmers.co.kr/learn/courses/30/lessons/17677
import Foundation

struct p17677 {
    static func run() {
//        print(p17677.solution("FRANCE", "french")) // 16384
//        print(p17677.solution("handshake", "shake hands")) // 65536
//        print(p17677.solution("aa1+aa2", "AAAA12")) // 43690
//        print(p17677.solution("E=M*C^2", "e=m*c^2")) // 65536
//        print(p17677.solution("aa1+aa2", "AA12")) // 32768
//        print(p17677.solution("abc", "abbb")) // 16384
//        print(p17677.solution("aaa", "bbb")) // 65536
        print(p17677.solution("BAAAA", "AAA")) // 32768
    }
    
    // 4:26 ~ 5:35
    static func solution(_ str1:String, _ str2:String) -> Int {
        // 입력형식을 준수하자!! 2글자식 끊는다고 합니다.
        var comparisonArray = Array<String>() // 대조군
        var experimentalArray = Array<String>() // 실험군
        
        for i in 0..<str1.count - 1 {
            let start = str1.index(str1.startIndex, offsetBy: i)
            let end = str1.index(str1.startIndex, offsetBy: i+1)
            
            if str1[start].isLetter && str1[end].isLetter { // 둘다 문자이면
                let extraction = String(str1[start...end]).lowercased()
                comparisonArray.append(extraction)
            }
        }
        
        for i in 0..<str2.count - 1 {
            let start = str2.index(str2.startIndex, offsetBy: i)
            let end = str2.index(str2.startIndex, offsetBy: i+1)
            
            if str2[start].isLetter && str2[end].isLetter { // 둘다 문자이면
                let extraction = String(str2[start...end]).lowercased()
                experimentalArray.append(extraction)
            }
        }
        
//        print(comparisonArray)
//        print(experimentalArray)
        
        var denominator: Double = 0 // 분모
        var intersectionCount: Double = 0 // 겹치는 갯수
        
        var tempArray = experimentalArray //
        for i in 0..<comparisonArray.count {
            if tempArray.contains(comparisonArray[i]) {
                let index = tempArray.firstIndex(of: comparisonArray[i])
                tempArray.remove(at: index!)
//                print(tempArray)
                
                intersectionCount += 1
            }
        }
        
        denominator = Double(experimentalArray.count + comparisonArray.count) - intersectionCount
//        print(intersectionCount)
//        print(denominator)
        
        
        var answer = 0
        if denominator == 0 {
            answer = 65536
        } else {
            if intersectionCount > denominator {
                answer = Int(denominator / intersectionCount * 65536)
            } else {
                answer = Int(intersectionCount / denominator * 65536)
            }
        }
        
        return answer
    }
}