https://school.programmers.co.kr/learn/courses/30/lessons/17677#
합집합, 교집합만 올바르게 구현 할 수 있다면 쉬운 문제. 집합에서 동일한 원소값 여럿 있다면, 교집합의 경우 제일 적은 집합의 수만큼 넣고, 합집합의 경우 가장 많은 수만큼 넣는다. 한쪽에만 동일한 여러개의 원소가 있는 경우에도, 이때 상대에게 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))
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
Swift) 2020 KAKAO BLIND RECRUITMENT - 괄호 변환 (0) | 2023.07.26 |
---|---|
Swift) 2018 KAKAO BLIND RECRUITMENT - 프렌즈 4블록 (0) | 2023.06.23 |
프로그래머스 : 프린터(Swift) (0) | 2021.09.15 |
프로그래머스 : 기능개발(Swift) (0) | 2021.09.14 |
프로그래머스 : 베스트 앨범(Swift) (0) | 2021.09.13 |