반응형
문제 설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
제한 사항- 두 수는 1이상 1000000이하의 자연수입니다.
3 | 12 | [3, 12] |
2 | 5 | [1, 10] |
입출력 예 #1
위의 설명과 같습니다.
입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.
나의 문제 풀이
func solution(_ n:Int, _ m:Int) -> [Int] {
var numA = min(n, m)
var numB = max(n, m)
var value = 0
for x in 1...numA {
// numA와 numB가 x로 나누어떨어지면 (공약수를 찾으면)
if numA % x == 0 && numB % x == 0 {
// 현재의 x 값을 최대공약수로 업데이트
value = x
}
}
// 최소공배수는 두 수의 곱을 최대공약수로 나눈 값
// [최대공약수, 최소공배수]를 반환
return [value, value * (numA / value) * (numB / value)]
}
다른 사람의 문제 풀이
unc solution(_ n:Int, _ m:Int) -> [Int] {
var first: [Int] = []
for index in 1...n {
if n % index == 0 && m % index == 0 {
first.append(index)
}
}
// 배열에서 가장 마지막 값이 최대공약수
let maxValue: Int = first[first.count-1]
return [maxValue ,(n * m)/maxValue ]
}
func solution(_ n:Int, _ m:Int) -> [Int] {
// 최대공약수를 계산하는 함수 gcd를 호출하여 g에 저장
let g = gcd(n,m)
// [최대공약수, 최소공배수]를 반환
return [g, g * (n/g) * (m/g)]
}
func gcd(_ n:Int,_ m: Int)->Int {
// 재귀적으로 최대공약수를 계산하는 함수
return n%m == 0 ? m : gcd(m, n%m)
}
//유클리드 호제법
func solution(_ n:Int, _ m:Int) -> [Int] {
var (a, b) = (n, m)
// b가 0이 될 때까지 반복
while b != 0 {
// a를 b로 나눈 나머지를 구해서 temp에 저장
let temp = a % b
// a를 b로, b를 temp로 갱신
a = b
b = temp
}
return [a, n * m / a]
}
반응형
'Programmers > LV1.' 카테고리의 다른 글
Lv1 | Swift - 3진법 뒤집기 (0) | 2024.07.15 |
---|---|
Lv1 | Swift - 예산 (0) | 2024.07.12 |
Lv1 | Swift - 행렬의 덧셈 (0) | 2024.07.04 |
Lv1 | Swift - 문자열 다루기 기본 (0) | 2024.07.03 |
Lv1 | Swift - 부족한 금액 계산하기 (0) | 2024.07.02 |