[프로그래머스 LV.0] Swift - 분수의 덧셈

David·2023년 1월 27일
0

알고리즘

목록 보기
1/4
post-thumbnail

처음에 이 문제는 풀지 못해 고민하다가 다른 분의 풀이를 참고하여 하단과 같이 풀었다.

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를 사용해볼 수 있지 않을까 싶다.

0개의 댓글