ReverseAndAdd/신재동 ¶
~cpp import unittest class ReverseAndAdder: def reverse(self, number): numberStr = str(number) reverseStr = '' for i in range(len(numberStr)): reverseStr += numberStr[len(numberStr) - i - 1] return int(reverseStr) def isPalindrome(self, number): numberStr = str(number) for i in range(len(numberStr)): if(numberStr[i] != numberStr[len(numberStr) - i - 1]): return False return True def reverseAndAdd(self, number): count = 0 for i in range(1000): number = number + self.reverse(number) count += 1 if(self.isPalindrome(number)): break else: print 'No reverse and add' return None return (count, number) class ReverseAndAdderTestCase(unittest.TestCase): def testReverse(self): raa = ReverseAndAdder() self.assertEquals(1234, raa.reverse(4321)) self.assertEquals(12321, raa.reverse(12321)) def testIsPalindrome(self): raa = ReverseAndAdder() self.assertEquals(False, raa.isPalindrome(4321)) self.assertEquals(True, raa.isPalindrome(12321)) self.assertEquals(True, raa.isPalindrome(1221)) def testReverseAndAdd(self): raa = ReverseAndAdder() self.assertEquals((4, 9339), raa.reverseAndAdd(195)) self.assertEquals((5, 45254), raa.reverseAndAdd(265)) self.assertEquals((3, 6666), raa.reverseAndAdd(750)) if __name__ == '__main__': #unittest.main() raa = ReverseAndAdder() result = raa.reverseAndAdd(int(input())) if(result != None): print str(result[0]) + ' ' + str(result[1])
그리 맘에 들지는 않는다. --재동
reverse 메소드 대신에 다음과 같이 간단히 할 수 있다:
~cpp >>> n=4321 >>> int(str(n)[::-1]) #python 2.3이상 1234 >>> int(''.join(reversed(str(d)))) #python 2.4이상 1234
파이썬에서 for 루프를 먼저 생각하는 것은 사고의 단위가 작은 것이고, 이것은 영문독해를 할 때 한번에 한단어씩 보는 것과 구문을 한번에 보는 것의 차이와 비교할 수도 있다.
위 코드를 이용하면...
~cpp >>> def rev(d): return int(str(d)[::-1]) >>> def revAndAdd(d): c=0 while True: rd=rev(d) if d==rd:break d+=rd c+=1 return c,d >>> revAndAdd(195) (4, 9339)
all tests data will be computable with less than 1000 iterations (additions)를 고려한다면 명시적인 회수 체크는 없어도 될 듯.
--JuNe
마치 pseudo code를 보는 것 같네요. --재동