프로그래머스 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
}
}
'알고리즘 문제 풀이' 카테고리의 다른 글
[Swift] BOJ 1238 파티 (0) | 2022.05.11 |
---|---|
[Swift] BOJ 1916 최소비용 구하기 (0) | 2022.05.11 |
[Swift] 프로그래머스 LV2. 수식 최대화 (0) | 2022.04.16 |
[Swift] 프로그래머스 LV2. [3차] 파일명 정렬 (0) | 2022.04.16 |
[Swift] 프로그래머스 LV2. 방문 길이 (0) | 2022.04.16 |