[코딩 테스트 연습 입문] 분수의 덧셈

2022. 12. 21. 16:37code/[프로그래머스] python

문제

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

 

❗제한사항

  • 0 <denum1, num1, denum2, num2 < 1,000

 

입출력 예

 

입출력 예 설명

입출력 예 #1

  • 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.

입출력 예 #2

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

 

✔풀이

def solution(denum1, num1, denum2, num2):
    denum3 = denum1 * num2 + denum2 * num1
    num3 = num1 * num2

    for denum in range(denum3, 1, -1):
        if (denum3%denum==0) and (num3%denum==0):
            denum3=denum3/denum
            num3 = num3/denum
    answer = [denum3,num3]

    return answer

📝설명

우선 denum3와 num3를 만들었다. 주어진 분모, 분자가 기약분수화 되기 전 단계이다. 분수화했을 때, 해당값이 기약분수라면 그대로 가면 아주 좋다..(내 개인적인 의견)

하지만, 모든 값들이 곧장 기약분수가 될 리가 없다.

최대공약수를 구해서 기약분수를 만들어줘야 한다.

최대공약수를 구할 수 있는 방법은 분모와 분자에 같은 수를 나눴을 때 나머지가 없도록 하는 가장 큰 수니까, 어떻게 진행할까 고민했다.

결론적으로 for문으로 진행했다. 

range(denum3,1,-1)을 다뤘다.

range안의 범위 설정을 하기까지 진짜 오류가 많이 났었는데,, 정말 신경이 온통 여기에 쏠리는 걸 경험했다.

어쨌든, 이걸 해석하면  denum3에서 1-(-1)까지의 -1씩 더하게 했다. 

만약 denum3이 4라면 denum으로는 4,3,2가 다뤄진다는 말!!

이렇게 구한 denum을 denum과 num에 나눈다.

나머지가 둘 다 0이라면, 앞선 구했던 denum3과 num3에서 denum을 나눈다.

그 후 answer에 넣어주면 끝! 

 

👑모범 답안

🔎 math 라이브러리를 사용했다.

      그래서 import로 math를 불렀다.

      gcd는 최대 공약수인 정수를 구해준다고 한다.

      예를 들어 math.gcd(12,27)라면, 3이 된다.

      참고로 최소공배수는 lcm로 구할 수 있다고 한다.

    

👀느낀 점

: 지금까지 푼 코딩 문제 중 가장 많은 시간을 소요했다.

  스트레스^^... 도 조금 받은 것 같은데, 해결하고 나니 이렇게 뿌듯할 수가 없다.

  이게 바로 내가 코딩을 시작하게 된 이유🤸🏻‍♀️🤸🏻‍♀️🤸🏻‍♀️

  파이썬에는 생각보다 많은 함수들이 있고, 난 아직 그런걸 잘 모른다.

  계속 코딩 테스트 문제 푸는 걸 병행하면서 많은 것들을 경험하고 내 것으로 만들테야