U E D R , A S I H C RSS

3N+1 Problem/1002_2

ì ‘ê·¼

연습장�서 �것저것 �어보기 시�. 처��는 � 결과 수 간� 무언가 수열� 있�까 해서 �어봄.
~cpp 
 1 2 8  3 6 9 17  4 20   7 9
  1 6 -5 3 3 8 -13 17 -13 2
�저히 수열스럽지 않아서 다시 숫�들 간� 관계를 �리 �어보�중, 지난번� UglyNumber �서� 문제접근법(DynamicProgramming)� 해봄. 혹시 앞� 계산값� 뒤� 계산� �용�지 않�까 ��� 해보다.
~cpp 
n 값� 변화
 1 : 1
 2 : 2 -> 1
 3 : 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
 4 : 4 -> 2 -> 1
 .
 .
숫�들� 주욱 나열해보면서 해당 n 값 대비 count cycle Length � 값� 고정��것��는 �과, � 값� �종� caching � 하여 �용할 수 있겠다는 ��� 들다.

연습장� �사 코딩 5분정� 한 뒤, 바로 코드로 옮기고 실행.


~cpp 
class CycleLength:
    def __init__(self):
        self._cache = {1:1}
    def createTable(self,i,j):
        return [self.value(each) for each in range(i,j)]
    def value(self,n):
        if self._cache.get(n) is not None: return self._cache.get(n)
        if n % 2 == 1:
            self._cache[n] = self.value(3*n+1)+1
            return self._cache[n]
        else:
            self._cache[n] = self.value(n/2)+1
            return self._cache[n]

    def maxCycleLengthInRange(self,i,j):
        #return max(self.createTable(i,j))
        maxValue=0
        for each in range(i,j):
            maxValue = max(maxValue,self.value(each))
        return maxValue

def testOne():
    r"""
    >>> c=CycleLength()
    >>> [c.value(n) for n in range(1,5)]
    [1, 2, 8, 3]
    >>> c.maxCycleLengthInRange(1,10)
    20
    >>> c.maxCycleLengthInRange(100,200)
    125
    >>> c.maxCycleLengthInRange(201,210)
    89
    >>> c.maxCycleLengthInRange(900,1000)
    174
    """

def main():
    import doctest
    doctest.testmod()

def main2():
    c=CycleLength()
    print c.maxCycleLengthInRange(1,999999)

if __name__=="__main__":
    import time
    start=time.time()
    import psyco
    psyco.bind(main2)
    main2()
    end = time.time()
    print "time :", end-start

�낀�

지난번� 문제를 풀었�때 '접근법' � 같� ��하여 문제 해결방법� �힌것� 추후� 문제(결과 �으로는 전혀 다른 알고리즘)� 해결법� 알아내는� 좋� 접근법� 제공해준 것� �낌� 좋았다. 새 해결책� 떠올리는� 10분� 안걸리고, 비�� 효과�� 알고리즘� 나온 ��서 기분� 좋� 중.

--1002


~cpp CycleLength.value 와 거� 비슷한 �사코드가 ��준� 연습장��... 무척 반가움. --��준
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:15
Processing time 0.0066 sec