728x90
1. 링크
https://www.acmicpc.net/problem/1463
2. 난이도(solved.ac 참고)
실버3
3. 풀이
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://www.acmicpc.net/problem/1463 | |
import sys | |
f = sys.stdin.readline | |
n = int(f()) | |
dp = [0] * 100001 | |
for i in range(2, n+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[n]) |
재귀형태의 다이나믹 프로그래밍으로 해결하였는데, 이렇게 푼 사람들이 많은 걸 보면 그냥 이렇게 풀라고 낸 문제 같다.
여기에서 dp배열의 값들은 1로 만드는 데 걸리는 횟수들이다.
여기에서 우선 dp[i] = dp[i-1] + 1은 그냥 1을 빼줬을 때에 해당한다. 그냥 빼기만 하면 이전 횟수에 비해 1회가 추가되는 것이 끝이기 때문.
2와 3으로 나눠질 경우, 횟수가 1회 추가되었으므로 dp[i//3]이나 dp[i//2]의 값에 +1을 해줬다. 그리고 그 값을 기존에 있던 dp[i-1]+1의 값과 비교를 해주었다.
'CS > 알고리즘' 카테고리의 다른 글
[Python] BOJ(백준) 14501번 - 퇴사 (0) | 2021.08.02 |
---|---|
[Python] 이것이 취업을 위한 코딩 테스트다 with 파이썬 - 바닥 공사 (0) | 2021.08.01 |
[Python] BOJ(백준) 1300번 - K번째 수 (0) | 2021.07.28 |
[Python] BOJ(백준) 2470번 - 두 용액 (0) | 2021.07.27 |
[Python] BOJ(백준) 2110번 - 공유기 설치 (0) | 2021.07.26 |