안녕하세요 :)
https://www.hackerrank.com/challenges/between-two-sets/problem
문제를 이해하는데 시간이 조금 걸렸지만.. 첨엔 이게 뭔소리야..
풀이
a = [2, 4] b = [16, 32, 96]
결론은 a의 배수이면서 b의 약수인 정수의 개수를 구하는 문제였습니다.
그래서 a의 최소공배수인 4를 먼저 구해준 다음 b의 최대공약수 16를 구해서 4와 16을 포함한 사이값 중에서 b의 약수가 되는 숫자의 개수를 구해주었습니다.
이 예시에서는 4, 8, 16 이렇게 3개가 정답이되므로 3을 return 해줍니다.
(12는 4의 배수이지만 16의 약수가 아니므로 정답이 아닙니다.)
// 최대공약수
func gcd(_ a: Int, _ b: Int) -> Int {
if b == 0 {
return a
} else {
return gcd(b, a%b)
}
}
// 최소공배수
func lcm(_ a: Int, _ b: Int) -> Int {
return a * b / gcd(a, b)
}
func getTotalX(a: [Int], b: [Int]) -> Int {
// Write your code here
var lcmNumber: Int = a.count > 1 ? lcm(a[0], a[1]) : a[0]
var gcdNumber: Int = b.count > 1 ? gcd(b[0], b[1]) : b[0]
if a.count > 2 {
for idx in 2..<a.count {
lcmNumber = lcm(a[idx], lcmNumber)
}
}
if b.count > 2 {
for idx in 2..<b.count {
gcdNumber = gcd(b[idx], gcdNumber)
}
}
var now: Int = lcmNumber
var ans = 0
while now <= gcdNumber {
var check: Bool = true
for number in b {
if number % now != 0 {
check = false
break
}
}
if check {
ans += 1
}
now += lcmNumber
}
return ans
}