1, 2, 5, 10, 20, 50, 100, 200페니짜리 동전으로 200페니를 만들 수 있는 가지수는?
1페니짜리 200개,
1*198 + 2*1
...
200*1
꽤 많은 가짓수가 존재하는 머리 아픈 문제지만 터무니없이(?) 짧은 코드로 답이 나온다.
1 <= 당연히 한가지
2 <= 2: 1+1, 2
3 <= 2: 1+1+1, 1+2
4 <= 3: 1+1+1+1, 1+1+2, 2+2
5 <= 3: ...
(귀찮아서 생략)
n 페니를 만드는 방법
= (1페니만으로 만드는 방법) + (2페니를 사용하는 방법)
= 1 + (어떻게든 n-2페니를 만들고 2페니짜리를 하나 더 사용하는 방법)
다시 한 번 반복..
1, 2 페니만 사용해서 n 페니를 만드는 가지수를 f(n)이라고 하면,
f(1) = 1
f(2) = 2
f(3) = 1 + f(1) = 2
f(4) = 1 + f(2) = 3
f(5) = 1 + f(3) = 3
...
이번에는 1, 2, 5페니만 사용해서 n페니를 만드는 가지수를 g(n)이라고 하면,
n페니를 만드는 방법
= (1,2페니만드로 만드는 방법) + (어떻게든 n-5페니를 만들고 5페니짜리 하나를 얹는 방법)
= f(n) + g(n-5)
이걸 5, 10, 20, ... 200페니 동전까지 적용하면 위의 코드가 된다.
brilliant!
덧, s를 dictionary로 정의하는 대신 list로 해도 된다. 여기서는 s = [0]*201로 정의해도 답이 똑같이 나온다.
덧2, 처음에 짰던 코드는
포럼에서 봤던 위 스타일의 코드가 생각나서 다시 작성할 때는 따라해 봤다.
No comments:
Post a Comment