728x90
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
X에서 사용하는 연산
- 3으로 나누어 떨어지면, 3으로 나누기
- 2로 나누어떨어지면 2로 나누기
- 1 빼기
연산을 사용하는 횟수의 최솟값
1~N을 쭉 보면서 저 연산들을 사용해서 1을 만들 수 있는 방법의 횟수 최솟값 구하기
- 2의 배수
- min(2로 나눈 값, 이전 dp + 1)
- 3의 배수
- min(3로 나눈 값, 이전 dp + 1)
- 나머지
- 이전 dp + 1회
3의 배수 먼저! 큰 애를 먼저 나눠야 횟수가 적음
import Foundation
//input
let n = Int(readLine()!)!
var dp = [Int](repeating: 0, count: 1000001)
dp[1] = 0
if n >= 2 {
for i in 2...n {
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])
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/Swift] 2156번: 포도주 시식 (0) | 2023.02.20 |
---|---|
[백준/Swift] 14501번: 퇴사(DP) (0) | 2023.02.20 |
[백준/Swift] 2839번: 설탕 배달 (0) | 2023.02.16 |
[백준/Swift] 11404번: 플로이드 (0) | 2023.02.16 |
[백준/Swift] 11053번: 가장 긴 증가하는 부분 수열 (0) | 2023.02.15 |