DHistory
[Baekjoon] DP - 12852 1로 만들기 2 본문
문제
풀이
1. 1로 만들기의 응용으로 생각하여 1로 만들기의 뼈대를 활용하였다.
2. 최소값을 구하는 부분에서 어떤 값을 선택할 지가 주된 문제이다.
3. DP는 큰 문제를 작은 문제로 해결할 수 있기 때문에 연속된 참조하고 있다.
3-1. 10인 경우 9와 5중 1로 만들 수 있는 경우의 수 중 작은 값을 선택한다.
3-2. 이 때, 9는 다음으로 3을 참조하고 5는 4를 참조한다.
3-3. 이를 반복하여 최종 결과물은 10 -> 9 -> 3 -> 1이 등장하게 된다.
4. 해당 참조를 구하기 위한 값을 따로 저장했다. (answer)
n = int(input())
d = [987654321] * (n + 1)
def solution(n, d):
result = [0] * (n + 1)
d[1] = 0
for i in range(2, n + 1):
min_value = n + 2
if not i % 3 and d[i] > d[i // 3] + 1:
d[i] = d[i // 3] + 1
min_value = i // 3
if not i % 2 and d[i] > d[i // 2] + 1:
d[i] = d[i // 2] + 1
min_value = i // 2
if d[i] > d[i - 1] + 1:
d[i] = d[i - 1] + 1
min_value = i - 1
result[i] = min_value
value = n
ansewr = [n]
while value:
if result[value] == 0:
break
ansewr.append(result[value])
value = result[value]
return ansewr
answer = solution(n, d)
print(len(answer) - 1)
print(*answer, sep=' ')
채점 결과
'Computer Science > Algorithm' 카테고리의 다른 글
[Baekjoon] DP - 10164 격자상의 경로 (0) | 2023.10.25 |
---|---|
[Baekjoon] DP - 2302 극장 좌석 (0) | 2023.10.25 |
[Baekjoon] DP - 1890 점프 (0) | 2023.10.25 |
[Baekjoon] DP - 1309 동물원 (0) | 2023.10.24 |
[Baekjoon] DP - 11660 구간 합 구하기 5 (0) | 2023.09.26 |