백준/문제풀이_python

1463 1로 만들기 _python

휴대용치즈 2022. 10. 10. 19:18

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

시간 제한이 0.15초

일반인의 반응속도0.25초보다 짧다. 일반인의 반응속도보다 빠르게 맞춰야 하는 문제.

막무가내 접근하면 틀린다.

count = 0
N=int(input())
while N!=1:
    if not N%3:
        N //= 3
    elif not N%2:
        N //= 2
    else:
        N -= 1
    count += 1

이렇게하면 10에서 4가 나온다.

다른 방식으로 접근해야 하는데 결국 해결하지 못하고 다른 블로그를 봤다.

내가 해결하지 못한 이유는 시간제한이 0.15초에 입력이 10^6이라서 절대 모든 경우를 파악하는건 말이 안된다고 생각했다.

 

 

문제 접근

풀이를 보고 놀란게, dp를 활용해도 시간초과일줄 알았는데 dp를 활용하는게 맞았다.

dp를 활용해서 2부터 3가지경우를 다 파악해서 최소값을 저장해두면서 진행해야한다.

dp의 상향식을 사용해서 1을 뺐을때, 2로 나누었을때, 3으로 나누었을때 계산중 최소값을 구해가면서 2부터 N까지 진행한다.

 

 

코드

 

import sys
input = sys.stdin.readline

N= int(input())
count = 0
dp = [0]*(N+1)

#dp[2]부터 dp[N]까지 상향식 사용
for i in range(2,N+1):
    dp[i] = dp[i-1]+1
    # -1과 2로 나누는 것 중 최소값을 저장
    if not i%2: dp[i] = min(dp[i],dp[i//2]+1)
    # 위의 최소값과 3으로 나눈것중 최소값을 저장
    if not i%3: dp[i] = min(dp[i],dp[i//3]+1)
        
print(dp[N])