프로그래머스-분수의 덧셈(파이썬,python)

SA Jung·2022년 10월 1일
0

Programmers 문제 풀이

목록 보기
6/14

https://school.programmers.co.kr/learn/courses/30/lessons/120808

[git]
https://github.com/JungSangA/Algorithm_Study/blob/main/%EC%88%98%ED%95%99/%EB%B6%84%EC%88%98%EC%9D%98%20%EB%8D%A7%EC%85%88.ipynb

1. 위의 공개된 입출력 테스트는 통과했지만 정확도 46.7%

def solution(denum1, num1, denum2, num2):
    answer = []
    # 두 수가 배수관계일때.
    if max(num1,num2)%min(num1,num2)==0:
        tmp =  max(num1,num2)//min(num1,num2)
        if num1 <=num2:
            answer = [denum1*tmp+denum2, num2]
        else:
            answer = [denum2*tmp+denum1, num1]
    # 두 수가 배수관계가 아닐때.
    else:
        answer = [denum2*num1+denum1*num2, num1*num2]
    
    # 약분되는지 판별
    if answer[0]%answer[1] ==0:
        x,y = divmod(answer[0],answer[1])
        answer[0] = x
        answer[1] = y+1
    return answer
  • 약분까지 판별해서 넣었는데 왜 error가 날까??!!!!
solution(12,20,24,40)
# [48, 40]
  • 어떤 부분이 문제가 있었는지 찾았다. 48/40은 6/5로 나뉘어져야한다.
  • 위의 조건에서 기약분수로 나타냈을 경우 분자와 분모를 순서대로 담은 배열을 return 하도록 명시되어 있다.
    • 기약분수란?
      분모와 분자가 1이외의 공통된 인수를 갖지 않을 때의 분수이다. 분수식을 공통인수로 나누게 되면 기약분수가 된다.

2. 소인수 분해를 통해 통과 코드

def solution(denum1, num1, denum2, num2):
    answer = []
    # 두 수가 배수관계일때.
    if max(num1,num2)%min(num1,num2)==0:
        tmp =  max(num1,num2)//min(num1,num2)
        if num1 <=num2:
            answer = [denum1*tmp+denum2, num2]
        else:
            answer = [denum2*tmp+denum1, num1]
    # 두 수가 배수관계가 아닐때.
    else:
        answer = [denum2*num1+denum1*num2, num1*num2]
    
    # 약분되는지 판별
    div = 2
    while min(answer[0],answer[1])>=div:
        if answer[0]%div==0 and answer[1]%div==0:
            answer[0] = answer[0]//div
            answer[1] = answer[1]//div
        else:
            div+=1
    return answer
solution(12,20,24,40)
# [6, 5]
  • 수학식을 이용한 것과 기약분수의 개념을 알고있느냐가 핵심인 문제로 보인다.
  • answer을 반환하기 전에 분자와 분모의 공통인수로 소인수분해를 진행해준다.
  • div를 2부터 계산을 해주어 분자와 분모의 공통인수로 가지고 있으면 div로 각각 나누어주고 answer에 다시 넣어준다.
  • 위와 같은 방식으로 div가 분모와 분자보다 커지고 더이상 나눌수 없을 때 while문을 빠져나올 수 있게 구현하여 answer을 구한 다음 answer을 return해준다.
profile
Tomorrow will be better than yesterday :)

0개의 댓글