문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 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
잘 돌아간다. 굿!
'프로그래밍 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 제곱수 판별하기 (0) | 2022.11.17 |
---|---|
[프로그래머스] 구슬을 나누는 경우의 수(조합 구하기) (0) | 2022.11.17 |