처음에 이 문제는 풀지 못해 고민하다가 다른 분의 풀이를 참고하여 하단과 같이 풀었다.
import Foundation
// 최대공약수 구하는 함수 gcd
func gcd(_ a:Int, _ b:Int) -> Int {
if a % b == 0 {
return b
}
return gcd(b, a%b)
}
func solution(_ numer1:Int, _ denom1:Int, _ numer2:Int, _ denom2:Int) -> [Int] {
// 분자 maxNumer
var maxNumer = (numer1*denom2) + (numer2*denom1)
// 분모 maxDenom
var maxDenom = denom1 * denom2
// gcdValue 변수에 최대공약수 함수를 이용하여 최대공약수 입력
var gcdValue = gcd(maxNumer, maxDenom)
// 배열 변수에 분자와 분모를 최대공약수로 나누어 기약 분수 입력
var result = [maxNumer/gcdValue, maxDenom/gcdValue]
// 결과값 반환
return result
}
다른 분의 아이디어를 참고하여 풀었지만, 처음에 내가 이 문제를 고민하면서 풀려고 했던 방법은 이렇다. 분자(maxNumer) 와 분모(maxDenom) 중 최소값을 구한 다음 그 최소값부터 1까지 순차적으로 각 분자와 분모를 나누어 보는 것이다. 그래서 공통으로 나누어 나머지 값이 0으로 나온다면 그 값이 최대공약수이기 때문에 그 값을 이용하여 결과를 도출하려고 했다.
이와 같은 방법으로 풀면 하단과 같다.
import Foundation
func solution(_ numer1:Int, _ denom1:Int, _ numer2:Int, _ denom2:Int) -> [Int] {
// 분자 maxNumer
var maxNumer = (numer1*denom2) + (numer2*denom1)
// 분모 maxDenom
var maxDenom = denom1 * denom2
// minNum 변수에 min 함수를 이용하여 둘 중 더 작은 값 입력
let minNum = min(maxNumer, maxDenom)
// stride 함수를 이용하여 minNum 부터 1까지 내림차순으로 순회?한다. 공통으로 0으로 나누어지는 값이 최대공약수이므로 최대공약수를 활용하여 값 도출.
for num in stride(from: minNum, to: 1, by: -1) {
if maxNumer % num == 0 && maxDenom % num == 0 {
maxNumer /= num
maxDenom /= num
}
}
// 결과값 반환
return [maxNumer, maxDenom]
}
내가 풀고 싶었던 방법은 stride 를 이용하는 거였는데, 답 제출 후 다른 분 풀이를 보니 이런 함수도 있구나 싶었다. 다음에 이런 풀이 방법이 생각난다면 for - stride를 사용해볼 수 있지 않을까 싶다.