QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

[Silver III] 1로 만들기 - 1463

문제 링크

성능 요약

메모리: 39504 KB, 시간: 556 ms

분류

다이나믹 프로그래밍(dp)

문제 설명

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

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

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

💡 Solutions

📄 1로 만들기.py

N = int(input())

dp = [0 for _ in range(N + 1)]


for idx in range(2,N+1): # 어차피2 일때는 무조건 count가 +1이된다.
  dp[idx] = dp[idx - 1] + 1
  
  if idx % 3 == 0:
    dp[idx] = min(dp[idx//3] + 1, dp[idx]) 
  if idx % 2 == 0 :
    dp[idx] = min(dp[idx//2] + 1, dp[idx]) 
print(dp[N])