파이썬 이집트 분수 계산

조회수 691회

안녕하세요, 파이썬으로 이집트 분수를 만드는 중입니다. 분수가 주어지면 가장 큰 분자가 1인 분수들로 그 분수를 표현하는것인데, 예를들면

egypt(4,5) 4/5 = 1/2 + 1/4 + 1/20 [2, 4, 20]

egypt(2,11) 2/11 = 1/6 + 1/66 [6, 66]

egypt(761, 1000) 761/1000 = 1/2 + 1/4 + 1/91 + 1/91000 [2, 4, 91, 91000]

이렇게 표현이 됩니다. 참고로, 그리디 알고리즘( greedy algorithm) 을 사용해야 하며, 나눗셈과 fraction 함수를 사용하지 않아야 합니다. 모든 계산은 정수로 해야하며 (n/d) - (1/c)를 계산하는게 핵심이라고 하는데, 나눗셈과 fraction 을 사용하지 않고 계산을 할 수 있는 법이 뭐가 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 자연수 나눗셈을 할 경우 항상 나누어 떨어지는 것은 아닌데, 이 경우 파이썬에서는 정확히 그 값 대신 근사한 값을 사용하기 때문에 나눗셈을 사용하면 오히려 문제가 풀리지 않을 수도 있습니다.

    코드를 직접 짜보려고 했는데 거기까지는 힘들 것 같아서... 대략적인 아이디어만 드릴테니까 한번 직접 구현해보세요

    1. x, y를 처음 주어진 값이라 가정
    2. x/y > 1/i를 만족하는 가장 작은 i를 찾기(2부터 검사하시면 됩니다)
    3. x/y - 1/i =x'/y' 를 통해 얻은 x'/y'를 새로운 x와 y로 설정
    4. x가 1이 될 때까지 2와 3을 반복

    대략 이런 형태면 될 것 같은데, 이 때 주의할 점은 3을 할 때 나눗셈을 사용하는 대신 우리가 직접 수학 문제를 풀듯이 양 쪽 수를 통분해서 분모와 분자를 각각 구하셔야 합니다

    뺄셈을 한 후에 x와 y를 약분하셔야 하구요

    이 과정을 반복해서 얻은 i값들과 마지막 y값이 이 함수에서 반환해야 하는 값이 됩니다.

    대략 이런 형태면 원하는 값을 구할 수 있을 것 같은데, 디테일한 부분은 직접 구현해보세요 ㅎㅎ

  • def egypt(numerator, denominator):
        nr = numerator
        dr = denominator
        c = 2
        fraclist = []
        if nr == 1 and dr !=0:
            print("{}/{}").format(nr,dr)
        while nr != 1:
            if nr < dr and nr != 0 or dr != 0:            
                if (c*nr - dr) > (dr * c):
                    nr = c*nr - dr
                    dr = c* dr
            c += 1
        fraclist.append("1/{}").format(c)
    
        print("+".join(fraclist))
    

    이렇게 짰는데 무한루프 돌아가는데 어디가 잘못됐는지 모르겠어요ㅠㅠ 답글로 코드가 안달려서 답변으로 작성합니다

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 예시로 보여주셨던 (4, 5) 손으로 직접 풀어보세요 의도한 대로 잘 되고 있는지. 중간중간 print문 넣어서 진행상황 확인해 보시는 것도 좋을 것 같습니다. HIAOAIH 2020.4.23 15:30
    • 다른건 다 완성을 했는데 약분하는거에서 막혔어요. 혹시 새로운 함수를 디파인 하는 법 말고는 fraction쓰지 않고 약분을 하는 방법은 없나요? 알 수 없는 사용자 2020.4.23 15:51
    • math 모듈에 최대공약수를 구하는 함수가 있고 그게 아니라면 직접 구현하셔도 되는데, 나눗셈을 쓰지 말라는 조건에 %도 포함이 되는건지, 모든 구간에서 다 사용하면 안되는건지 등 세부적인 조건을 몰라서 더 자세한 말씀을 드리기는 어렵겠네요.. 일단 최대공약수 구하는 방법부터 찾아보시고 문제에 주어진 조건에 부합하지 않는 부분이 있는지 잘 살펴보세요 HIAOAIH 2020.4.23 16:01
    • 기약분수가 아닐 때에는 nr != 1 이란 조건이 유효하지 않아요. nowp 2020.4.23 16:03

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)