본문 바로가기

프로그래밍/프로그래머스

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

문제 설명

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


제한사항

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

기약분수는 더 이상 약분할 수 없는 분수이다.

 

나의 풀이 1. 오답,,,

def solution(denum1, num1, denum2, num2):
    
    a=denum1*num2+denum2*num1
    b=num1*num2
    
    for i in range(2,min(a,b)+1):
        if a%i==0 and b%i==0:     # 여기에서 오답이 발생했다!
            a=a//i
            b=b//i
            
    answer = [a,b]
    return answer

먼저 a와 b에 각각 통분을 거친 분자와 분모를 저장해주었다. 

문제에서 주어진 조건인 기약분수는 더 이상 약분할 수 없는 분수이다. 

그래서, 처음에는 for문을 활용하여 분모와 분자의 공약수를 찾아내기로 했다.

2부터 분모와 분자 중 작은 수까지 for문을 돌리며 공약수를 찾아내고, 

만약 공약수일 경우 해당 값으로 나누어준다. 

 

그러나 위 코드를 실행했을 때

2개였나 3개 정도의 테스트 케이스에서 오답이 발생하여 

곰곰히 생각해본 결과 아뿔싸!

약수가 한 번씩만 들어있지 않을 수도 있잖아? 

 

예를 들면 2로 한 번씩 더 나누어주어야 기약분수가 되는 상황에서

위 코드는 무조건 2~min(a,b)까지 한 번씩만 판별하여 지나가기 때문에 

기약분수를 만들지 못하는 것이다...

그래서 i로 나눌 수 있을 경우에는 무조건 약분을 반복하도록 while문을 붙여주었다. 

 

나의 풀이 2. 정답!

def solution(denum1, num1, denum2, num2):
    
    a=denum1*num2+denum2*num1
    b=num1*num2
    
    for i in range(2,min(a,b)+1):
        while(a%i==0 and b%i==0):
            a=a//i
            b=b//i
            
    answer = [a,b]
    return answer

잘 돌아간다. 굿!