Approach ¶
์ผ๋จ Factorial ์ด๋ผ๋ ์ ์์ ํด๋น ๊ณ์ฐ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์์ ๋ง๋ค์ด๋.
F(n) = Count(n) + F(n-1) Count(n) = ํด๋น n ์ ๋ํ ์ธ์ํญ ์ดํฉ๊ทธ๋ฆฌ๊ณ F, Count ๋ค์ ๋ํด์ caching ์ ์งํํ ์ ์์ผ๋ฆฌ๋ผ ์๊ฐ, ๋ค์๊ณผ ๊ฐ์ด ํ์.
~cpp class Counter: def __init__(self): self._cache=[None] * 1000000 def __call__(self,n): return self.count(n) def count(self,n,start=0): value = self._cache[n] if value != None: return value+start half = n/2 for e in xrange(2,half+1): if n % e ==0: result = self.count(n/e,start+1) self._cache[n] = result return result result = start+1 self._cache[n] = result return result CountFunc = Counter() def factorialFactor(n): total = sum((CountFunc(i) for i in xrange(2,n+1))) return total def main(): for i in [2,5,8,1996,123456,1000000]: print factorialFactor(i)
๋๋์ ¶
- ํน์๋ ํด์ C++ ๋ก ์ฝ๋๋ฅผ ๋ฐ๊ฟ๋ดค๋๋ฐ (์ฝ๋ ์ฎ๊ธฐ๋๋ฐ 5๋ถ) 100๋ง ๊ตฌํ๋๋ฐ๋ 12์ด ์ ๋ ์์.
- ์๊ณ ๋ฆฌ์ฆ์ ์๋๋ฅผ ๋ณด๋ Counter ๋ถ๋ถ์ด O(n^2) ์ด๋ค. caching ์ ํจ์๋ ๊ทธ๋ ๋ค๋ ๊ฒ์ ๋ฌด์ธ๊ฐ ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ด ์์ผ๋ฆฌ๋ผ.
- Python ์์ O(n^2) ์ธ ์๊ณ ๋ฆฌ์ฆ์ C++ ์์๋ O(n^2) ์ด๋ค.
๊ฒฐ๊ตญ์ Python ์์ 5์ด ๋ด๋ฅผ ๋ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ค์ด์ผ C++ ๋ก 1์ด ์ด๋ด์ ์๋๊ฐ ๋์ฌ ๊ฒ์ด๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ์๋๋ฅผ ๋ณด๋ Counter ๋ถ๋ถ์ด O(n^2) ์ด๋ค. caching ์ ํจ์๋ ๊ทธ๋ ๋ค๋ ๊ฒ์ ๋ฌด์ธ๊ฐ ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ด ์์ผ๋ฆฌ๋ผ.
- ํํ๊บผ ์๊ณ ๋ฆฌ์ฆ ์๋ ๋ณด๊ณ ์ข์ ํ๋ค. ๋ด๊ฐ ZP ๋ฅผ ๋ ๋ ๋๊ฐ ๋์๊ตฌ๋.;;