출처 : 백준 #1463
시간 제한 | 메모리 제한 |
---|---|
0.15초 | 128MB |
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
첫째 줄에 1보다 크거나 같고, 10^6보다 작거나 같은 정수 N이 주어진다.
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
2
1
10
3
Top down
, Bottom up
방식 중 하나를 골라서 풀어야 했는데, Top down
방식이 생각하기는 쉬웠지만 구현이 어려워서 Bottom up
방식을 이용하였다.Top down
방식으로 해보니 메모리초과가 나왔다. bottom up
방식을 이용하였다.# 백준 1463번
from sys import stdin
import sys
sys.setrecursionlimit(10**6)
def makeOne(arr, n):
if n == 1:
return 0
if arr[n] > 0:
return arr[n] # 이미 채워진 것
arr[n] = makeOne(arr, n-1) + 1
if n % 2 == 0:
temp = makeOne(arr, n//2) + 1
arr[n] = temp if temp < arr[n] else arr[n]
if n % 3 == 0:
temp = makeOne(arr, n//3) + 1
arr[n] = temp if temp < arr[n] else arr[n]
return arr[n]
f = stdin.readline
n = int(f())
arr = [0 for _ in range(n+1)]
result = makeOne(arr, n)
print(result)
# 백준 1463번
from sys import stdin
def makeOne(arr, n):
for i in range(2, n+1):
arr[i] = arr[i-1] + 1
if i % 3 == 0:
arr[i] = min(arr[i//3]+1, arr[i])
if i % 2 == 0:
arr[i] = min(arr[i//2]+1, arr[i])
return arr[n]
f = stdin.readline
n = int(f())
arr = [0 for _ in range(n+1)]
result = makeOne(arr, n)
print(result)