문제 링크 :
https://www.acmicpc.net/problem/1463
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
예제 입력 :
2
예제 출력 :
1
import sys
input = sys.stdin.readline
num = int(input())
dp = [0]*(num+1)
for i in range(2, num+1):
dp[i] = dp[i-1] + 1
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3]+1)
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2]+1)
print(dp[num])
/와 //의 차이
//은 나누고 난 후 뒤 소수점을 버린다!
/은 안버림
나는 DP랑 안맞는 것 같다..
멍청함의 한계인가ㅠㅠㅠㅠㅠ흑
사실 고등학교때도 수열은 잘 못했다
이쪽도 머리가 다 있나보다 ㅠㅠ
이번에도 결국 다른 사람의 생각을 참고했다....
DP는 코드는 그 무엇보다 간단한데
이 방법을 생각해내는 게 어려운 것 같다.
나의 경우
우선 1을 빼고
3으로 나눠지는 경우와 2로 나눠지는 경우를 계산했다.
얘는 피보나치처럼 생각하면 되는 듯 하다.
다음 DP는 꼭 내 머리로만 풀고 싶다ㅠㅠ
[Python] 백준 2293번 - 동전 1 (0) | 2022.02.13 |
---|---|
[Python] 백준 22869번 - 징검다리 건너기 (0) | 2022.02.13 |
[Python] 백준 17626번 - Four Squares (0) | 2022.02.04 |
[Python] 백준 20437번 - 문자열 게임 2 (0) | 2022.01.28 |
[Python] 백준 17609번 - 회문 (0) | 2022.01.27 |
댓글 영역