[프로그래머스]분수의 덧셈

뜨또·2024년 5월 20일
0

프로그래머스

목록 보기
1/2
post-thumbnail

문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 <numer1, denom1, numer2, denom2 < 1,000

입출력 예

numer1 denom1numer2denom2result
1234[5, 4]
9213[29, 6]

입출력 예 설명

#1 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.
#2 9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.


내가 제출한 코드

정답 여부: ⭕

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    guard 1...1001 ~= numer1, 1...1001 ~= numer2,
          1...1001 ~= denom1, 1...1001 ~= denom2 else { return [0, 0] }
    
    // 분모 통일시켜 분수 계산
    let numer: Int = (numer1 * denom2) + (numer2 * denom1)
    let denom: Int = denom1 * denom2
    
    // 분모, 분자 소인수분해
    var numerArr: [Int] = []
    var denomArr: [Int] = []
    
    for divider1 in 1...numer {
        if numer % divider1 == 0 {
            numerArr.append(divider1)
        }
    }
    
    for divider2 in 1...denom {
        if denom % divider2 == 0 {
            denomArr.append(divider2)
        }
    }
    
    // 두 수의 최대공약수
    var maxDivider: Int = 0
    for n in numerArr {
        for d in denomArr {
            if n == d {
                maxDivider = n
            }
        }
    }
    
    // 최대공약수로 분자와 분모 나누기
    let finalNumer: Int = numer / maxDivider
    let finalDemer: Int = denom / maxDivider
    
    
    return [finalNumer, finalDemer]
}

몰랐거나 새로 알게된 점

  • '유클리드 호제법'이라는 것을 사용해서 구할 수도 있었음
import Foundation

func solution(_ denum1:Int, _ num1:Int, _ denum2:Int, _ num2:Int) -> [Int] {
    /*
     1. 분자와 분모를 통분해서 두 분수의 합을 구한다.
     2. 1에서 구한 분수에서 분자와 분모의 최대 공약수(gcd)를 유클리드 호제법을 사용해서 구한다
     3. 기약분수로 나타내어야 하기 때문에 구한 최대 공약수로 1에서 구한 분수의 분자와 분모를 나눠서 정답 배열에 각각 담아준다
     */
    let denum3 : Int = denum1 * num2 + denum2 * num1
    let num3 : Int = num1 * num2

    var a : Int = max(denum3, num3)
    var b : Int = min(denum3, num3)

    let gcd : Int
    var resultArray : [Int] = []

    // 최대공약수를 구하는 유클리드 호제법
    while b != 0 {
        let r = a % b
        a = b
        b = r
    }
    gcd = a

    resultArray.append(denum3 / gcd)
    resultArray.append(num3 / gcd)

    return resultArray
}
// 이렇게 할 수도 있었다,,
profile
멋있는 개발자(가 되고 싶은) 이갈

0개의 댓글