U E D R , A S I H C RSS

Primary Arithmetic/Leonardong

접근 방법

수식을 구현한다는 생각었다.
~cpp 캐리 = 자리수1 + 자리수2 + 전단계 캐리(자리수1+자리수2)

코드

~cpp 
def carry( *digits ):
    result = 0
    for digit in digits:
        result += digit
    if result > 9:
        return 1
    return 0

def getValueOfDegree( num, degree ):
    if degree == 0:
        return 0
    return (num % (degree * 10)) / degree
def countUpCarry( n, m ):
    count = 0
    degree = 1
    while degree < 10*(n + m):
        count += carry( getValueOfDegree( n, degree ),
                        getValueOfDegree( m, degree ),
                        getCarry( n, m, degree) )
        degree *= 10
    return count
def getCarry( n, m, degree ):
    if degree == 0:
        return 0
    return carry( getValueOfDegree( n, degree/10 ), getValueOfDegree( m, degree/10 ), getCarry(n, m, degree/10) )
#########################################################################           
import unittest

class TemplateTestCase(unittest.TestCase):
    def testCountUpCarryEqualDegreeOne(self):
        self.assertEquals( 0, countUpCarry( 0,0 ) )
        self.assertEquals( 1, countUpCarry( 9,1 ) )
    def testGetValueOfDegree(self):
        self.assertEquals( 0, getValueOfDegree( 0, 1 ) )
        self.assertEquals( 2, getValueOfDegree( 1234, 100 ) )
        self.assertEquals( 0, getValueOfDegree( 1, 10 ) )
    def testCountUpCarryEqualDegreeTwo(self):
        self.assertEquals( 0, countUpCarry( 10,10 ) )
        self.assertEquals( 1, countUpCarry( 10,90 ) )
    def testComplex(self):
        self.assertEquals( 4, countUpCarry( 1, 9999 ) )
        self.assertEquals( 2, countUpCarry( 1, 9099 ) )
    def testCarry(self):
        self.assertEquals( 0, carry( 0,0 ) )
        self.assertEquals( 1, carry( 1,9 ) )
#########################################################################
if __name__ == '__main__': 
    unittest.main()

렇게 놓고 보니 수식과 비교해 름을 잘못 지은 부분 눈에 보인다. 아무튼 전단계 캐리를 구하는 부분을 그냥 작성하느라 흐름을 타지 못했다. 잘 돌아가는 프로그램을 만들었지만, 머리 속에 함수 재귀 호출을 계속 떠올리고 있었다. 수식란 메타포가 있었는데도 구현을 하는데 메타포를 코드와 연결시키는데 오래 걸렸다. 아니 메타포를 생각하고 구현한 것 아니다. 중복을 없애다 보니 그제서야 수식 눈에 들어왔다.
빠른 속도가 아니었는데도 오히려 예상했던 시간(1시간) 안에 끝마쳤다. 시간안에 테스트&리팩토링 끝내기는 여전히 잘 안되는 편다. 한 번 더 해봐도 괜찮을 문제 같다.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:02
Processing time 0.0086 sec