728x90
https://school.programmers.co.kr/learn/courses/30/lessons/17677
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제를 보면 알 수 있듯이... 딱 봐도 쉬운 문제였다.
2 글자씩 떼어내서 그 원소들로 교집합이랑 합집합의 값을 구해서 결괏값을 출력하면 된다.
그런데 계속 안풀려서 결국 다음날로 넘겼다......
문제는 합집합에 대한 제대로 된 개념을 가지지 못했다는 것....!!
충격적 이게도 합집합을 그냥 두 집합의 원소의 개수 합이라고 생각했다.
그런데 정확하게는 합집합은 두 집합의 원소 개수 - 교집합 개수 다!!
이렇게 쉬운 개념을 정신을 놓았는지...
처음에는 set으로 하려고 했는데 예제 3번을 보면 aa1+aa2, AAAA12의 경우, AA가 중복으로 나타나서 안되었다.
그리고 Swift는 multiset은 제공하지 않기 때문에 내가 따로 구현해야 했는데 그렇게 하기엔 시간도 부족할 거 같았고 손 대기 쉽지 않았다.
그래서 array로 진행했다.
문제에서 모든 것을 알려줬는데,
다중집합(multiset), A와 B 모두 공집합일 경우 1 (* 65536)
여기서 추가적으로 만약 교집합이 공집합일 경우는? 합집합으로 0을 나눠야 하므로(에러!) 0을 반환해 줬다.
func solution(_ str1:String, _ str2:String) -> Int {
let str1 = str1.uppercased().map{ $0 }
let str2 = str2.uppercased().map{ $0 }
var arr1 = [String]()
var arr2 = [String]()
for i in 0..<str1.count-1 {
if str1[i].isLetter, str1[i+1].isLetter {
arr1.append(String(str1[i]) + String(str1[i+1]))
}
}
for i in 0..<str2.count-1 {
if str2[i].isLetter, str2[i+1].isLetter {
arr2.append(String(str2[i]) + String(str2[i+1]))
}
}
var union = arr1.count + arr2.count
var intersection = 0
for i in arr1.indices{
for j in arr2.indices{
if arr1[i] == arr2[j]{
intersection += 1
arr2.remove(at: j)
break
}
}
}
union -= intersection
if union == 0 { return 65536 }
if intersection == 0 { return 0 }
return Int(Double(intersection) / Double(union) * 65536)
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Swift] 오픈채팅방 (0) | 2023.01.05 |
---|---|
[프로그래머스/Swift] 주차 요금 계산 (0) | 2023.01.04 |
[프로그래머스/Swift] 귤 고르기 (0) | 2023.01.03 |
[프로그래머스/Swift] n^2 배열 자르기 (0) | 2023.01.01 |
[프로그래머스/Swift] 튜플 (0) | 2022.12.29 |