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 2009-05-27 07:09:19
Processing time 0.0113 sec