여름의 서재

[백준] 1463_1로 만들기 (dp 이용) 본문

알고리즘/BOJ

[백준] 1463_1로 만들기 (dp 이용)

엉아_ 2021. 10. 30. 00:47
728x90

📕 문제

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

💡 풀이법

1. dp라는 리스트를 만들어준다. 이 리스트에는 1에서 해당 인덱스의 숫자가 될때까지의 최소한의 연산이 들어간다.

2. 나는 반대로 1에서 정수 N까지 가는 연산을 구해줬다.

3. 처음에는 +1 연산으로만 간다고 생각하고 숫자를 dp에 숫자를 넣어준다.

4. 더하기 1 연산은 모든 경우에 다 가능하기 때문에 dp[현재 인덱스 -1] + 1 의 값과  현재 인덱스의 값을 비교해서 더 작은 걸 dp에 넣는다.

5. 이제 for문을 돌며 현재 인덱스가 3의 배수이면 곱하기 3 연산을 쓸 수 있는 것이므로 dp[현재 인덱스//3] + 1 의 값과 현재 인덱스의 값을 비교해서 더 작은걸 dp에 넣는다.

6. 현재 인덱스가 2의 배수이면 곱하기 2 연산을 쓸 수 있는 것이므로 dp[현재 인덱스//2] + 1 의 값과 현재 인덱스의 값을 비교해서 더 작은걸 dp에 넣는다.

 

X = int(input())
dp = [0] + [i for i in range(X+1)]

for n in range(1, X+1):
    dp[n] = min(dp[n], dp[n-1]+1)
    if not n % 3:
        dp[n] = min(dp[n], dp[n//3]+1)
    if not n % 2:
        dp[n] = min(dp[n], dp[n//2]+1)

print(dp[X])

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 14719_빗물  (0) 2021.10.30
[백준] 20057_마법사 상어와 토네이도  (0) 2021.10.30
[백준] 3190_뱀  (0) 2021.10.30
[백준] 16926_배열 돌리기1  (0) 2021.10.25
[백준] 1197_최소 스패닝 트리 (prim 이용)  (0) 2021.10.20
Comments