문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
풀이
n = int(input())
d = [0] * (n+1)
d[0] = 0
d[1] = 0
for i in range(2,n+1):
if n == 0 :
continue
#현재의 수에서 1을 빼는 경우
d[i] = d[i -1] +1
if i % 3 == 0: # 3으로 나눌 경우
d[i] = min(d[i],d[i//3]+1)
if i % 2 == 0: # 2로 나눌 경우
d[i] = min(d[i], d[i//2]+1)
print(d[n])
느낀 점
다이나믹 프로그래밍 실버 3 티어 정도 되는 문제다. 풀이는 쉽게 구현했는데 계속 틀렸다고 해서 뭐가 틀린 거지? 그럴 리가 없는데 하면서 계속 오류를 찾아내려고 했다. 다른 사람들이 푼 해답을 봐도 내가 푼 게 틀릴 리가 없는데.. 하면서 코드 한 줄 한줄 분석하면서 내려갔는데 if 문에서 i % 3 , i % 2를 n으로 써서 계속 틀렸다고 한 거였다. 이런 실수를 하다니 조심해야겠다.
'Algorithm' 카테고리의 다른 글
[BOJ/백준] 1003번 피보나치 함수 (0) | 2020.11.26 |
---|---|
[BOJ/백준] 9095번 1,2,3 더하기 (0) | 2020.11.26 |
[BOJ/백준] 2839번 설탕 배탈 (0) | 2020.11.26 |
[이코테] 다이나믹 프로그래밍(Dynamic Programming) (0) | 2020.11.24 |
[프로그래머스] N개의 최소 공배수 (0) | 2020.11.23 |