17. 다이나믹 프로그래밍 : 1로 만들기
2021. 11. 17. 19:41ㆍ파이썬/알고리즘
정수 X에 사용할 수 있는 연산은 다음과 같이 4가지 이다.
1. X가 5로 나누어진다면, 5로 나눈다.
2. X가 3로 나누어진다면, 3으로 나눈다.
3. X가 2로 나누어진다면, 2로 나눈다.
4. X에서 1을 뺀다.
정수 X가 주어졌을 때 연산 횟수의 최솟값을 출력하시오.
count = 0
def five_divide (x):
global count
count += 1
return x/5
def three_divide (x):
global count
count += 1
return x/3
def two_divide (x):
global count
count += 1
return x/5
def one_minus (x):
global count
count += 1
return x-1
num = int(input())
while num != 1 :
if (num -1) % 5 == 0:
num = one_minus(num)
num = five_divide(num)
elif num % 5 == 0:
num = five_divide(num)
elif num % 3 == 0:
num = three_divide(num)
elif num % 2 == 0:
num = two_divide(num)
else:
num = one_minus(num)
print(count)
나는 그냥 그리디처럼 풀었다. ㅠㅠ
그냥 5로 나누거나 항상 -1을 했을 때 5로 나누어질 때 연산의 최솟값이 나온다고 추정을 했다.
우선 위 코드가 예제 input을 입력할 때 정답은 나오는데 이게 어느 숫자에나 적용되는 코드인지 모르겠다는게 문제..
x = int(input())
d = [0] * 30001
for i in range(2, x + 1):
d[i] = d [i - 1] + 1
if i % 2 == 0:
d[i] = min(d[i], d[i//2]+1)
if i % 3 == 0:
d[i] = min(d[i], d[i//3]+1)
if i % 5 == 0:
d[i] = min(d[i], d[i//5]+1)
print(d[x])
아 이해 됬다. ㅋㅋ 아 재밋네
반응형
'파이썬 > 알고리즘' 카테고리의 다른 글
| 19. 다이나믹 프로그래밍 : 타일 깔기, 효율적인 화폐 구성 (0) | 2021.11.17 |
|---|---|
| 18. 다이나믹 프로그래밍 : 개미 전사 (0) | 2021.11.17 |
| 16. 다이나믹 프로그래밍 : 문제 풀이 전략 (0) | 2021.11.17 |
| 15. 이진 탐색: 떡볶이 떡 만들기 (0) | 2021.11.17 |
| 14. 이진 탐색 : 문제 풀이 전략 (0) | 2021.11.17 |