빙수의 coding/백준
[백준] 1463번 1로 만들기
팝빙수
2023. 12. 21. 17:32
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
가장 쉬우면서도 대표적인 dp 문제이다.
2로 나눈 수, 3으로 나눈 수, 1을 뺀 수에 대한 최소 계산 횟수를 안다면, 각각의 수에 해당하는 최소 계산 횟수에서 1만 더해주면 연산을 시행하기 전 수에서의 최소 계산 횟수를 구할 수 있다. 한마디로 n이라는 수를 입력받았을 때 n까지 모든 수에 대한 최소 계산 횟수를 구해 list에 저장하면 된다.
코드는 아래와 같다. 더 간결하게 쓸 수 있을것 같아서, 추후 기회가 된다면 수정하고자 한다.
n = int(input())
count = [0] * (n+1)
for i in range(n):
if((i+1)%6 == 0):
count[i+1] = min(count[i], count[int((i+1)/2)], count[int((i+1)/3)])+1
else:
if((i+1)%2 ==0):
count[i+1] = min(count[i], count[int((i+1)/2)])+1
elif((i+1)%3 == 0):
count[i+1] = min(count[i], count[int((i+1)/3)])+1
else:
if(i!=0):count[i+1] = count[i] +1
print(count[n])