-문제: https://www.acmicpc.net/problem/1463
거의 3번째로 푸는 문제인데, 또 못 풀었다 이번에는 꼭 풀이 다 이해하고, 작성까지 연습하고 가야겠다
n이라는 숫자는 n-1에서 1을 더하거나, n//2에서 2를 곱하거나, n//3에서 3을 곱한 경우가 있다
따라서 점화식으로는 dp[n]=min(dp[n//3]+1,dp[n//2]+1,dp[n-1]+1)인데, 이를 그대로 이용하는 것이 아니라
n이 3의 배수인 경우와 2의 배수인 경우를 나눠서 dp[n-1]+1과 비교해야 한다
n이 모두 2와 3의 곱으로 이루어진 경우는 없지만, n-1에서 +1이 된 경우는 있기 때문이다.
따라서 정답풀이를 작성하면 다음과 같다
for문의 범위가 2부터 시작하는 이유는
1부터 시작한다면 dp[1]==1이고, dp[2]==2가 되므로 틀리기 때문이다.
문제는 1까지 가는 경우의 수를 말했으므로, dp[1]==0이어야 한다 그래야 dp[2]==1이 된다
여전히 다 풀지 못했지만, 적어도 풀이가 이해가 가서 조금이라도 발전했다
n=int(input())
dp=[0 for _ in range(n+1)]
for i in range(2,n+1):
dp[i]=dp[i-1]+1
if i%2==0 :
dp[i]=min(dp[i//2]+1,dp[i])
if i%3==0 :
dp[i]=min(dp[i//3]+1,dp[i])
print(dp[n])
위의 풀이는 정답인데, 왜 밑에 풀이는 정답이 아닌지 모르겠다 그냥 같은거 대체한 거 아닌가??
n=int(input())
dp=[0 for _ in range(n+1)]
for i in range(2,n+1):
dp[i]=dp[i-1]+1
if i%2==0 :
dp[i]=min(dp[i//2]+1,dp[i-1]+1) #여기와
if i%3==0 :
dp[i]=min(dp[i//3]+1,dp[i-1]+1) #여기만 다르다
print(dp[n])
'백준 > DP' 카테고리의 다른 글
[dp/백준] 9095번: 1,2,3 더하기(2차) (0) | 2022.06.01 |
---|---|
[dp/백준] 1003번: 피보나치 함수(2차) (0) | 2022.05.30 |
[dp/백준] 18353번: 병사 배치하기 (0) | 2022.05.27 |
[백준/dp] 14501번: 퇴사(2차) (0) | 2022.05.26 |
[dp/백준] 1932번: 정수 삼각형 (2차 시도) (0) | 2022.05.26 |