https://www.acmicpc.net/problem/12852
12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
<풀이>
import sys
input = sys.stdin.readline
n = int(input())
dp = [[0, []] for _ in range(n+1)]
# dp[i][0] i로 갈 수 있는 계산횟수
# dp[i][1] i로 가는동안 지나간 경로
dp[1][0] = 0
dp[1][1] = [1]
for i in range(2, n+1):
# +1
dp[i][0] = dp[i-1][0] + 1
dp[i][1] = dp[i-1][1] + [i]
# %3
if i % 3 == 0 and dp[i//3][0] + 1 < dp[i][0]:
dp[i][0] = dp[i//3][0] + 1
dp[i][1] = dp[i//3][1] + [i]
# %2
if i % 2 == 0 and dp[i//2][0] + 1 < dp[i][0]:
dp[i][0] = dp[i//2][0] + 1
dp[i][1] = dp[i//2][1] + [i]
print(dp[n][0])
print(*dp[n][1][::-1])
dp로 풀어야되는데 dp가 어렵네요...
나누어떨어지고 계산횟수가 적을 경우에만 지나온 경로를 바꿔줍니다.
'파이썬' 카테고리의 다른 글
[BOJ PYTHON] 1080번 행렬 (0) | 2022.08.17 |
---|---|
[BOJ][PYTHON] 6603번 로또 (0) | 2022.08.15 |
[백준 파이썬] 1325번 효율적인 해킹 (1) | 2022.08.10 |
[백준 파이썬] 4963번 섬의 개수 (0) | 2022.08.08 |
[백준 파이썬] 2225번 합분해 (0) | 2022.08.06 |