728x90
반응형
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
코딩
import sys
n=int(sys.stdin.readline())
def makingOne(num):
tmp=0
ret=[0,0,1,1]
if num<4:
print(ret[num])
else:
for x in range(4,num+1):
tmp=ret[x-1]+1
if x%2==0:
tmp=min(tmp,ret[x//2]+1)
if x%3==0:
tmp=min(tmp,ret[x//3]+1)
ret.append(tmp)
print(ret[num])
makingOne(n)
-처음에는 입력받는 n에서부터 하향식으로 하려고 생각하고 구상을 했지만 도저히 답이 안나올거 같았다. 여러 갈래로 도달 할 수 있는데 각자 다 구하고나서 최소값을 비교하면 비효율적이고 구현도 어려워서 반대로 밑에서부터 올라가는 방법을 생각했다.
-결국 최소값을 구할 때는 경우에 수를 모두 구하고 난 후 비교를 할 수도, 과정을 거치면서 그때마다 최소인 값을 구해서 나아갈 수도 있음을 배울 수 있었다.
-메모리에 n까지 최소값을 메모이제이션하면서 구하는 방법이 처음에는 메모리 낭비가 심할 것으로 판단해서 제외하고 고민했지만 결국 이 방법으로 하게되었다. 다른 좋은 방법이 없을지 고민해봐야지..ㅎㅎ
728x90
반응형
'IT기초 > 알고리즘' 카테고리의 다른 글
| [1005번] ACM Craft 코딩(성공) (1) | 2019.01.05 |
|---|---|
| [2407번] 조합(Combination) 코딩 (1) | 2019.01.02 |
| [1676번] N! 0의 개수 코딩 (0) | 2019.01.02 |
| [알고리즘]동적 계획법 (2) | 2018.12.20 |
| [알고리즘]분할 정복(Divide and Conquer) (0) | 2018.12.20 |