문제
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
풀이
N을 만들기 위한 3가지 방법은 다음과 같다.
1. N가 3으로 나누어 떨어지면, 3으로 나눈다.
2. N가 2로 나누어 떨어지면, 2로 나눈다.
3. 1을 뺀다.
이를 식으로 표현하면,
1. dp[n] = dp[n/3] + 1
2. dp[n] = dp[n/2] + 1
3. dp[n] = dp[n-1] + 1
이고, 3나누기 -> 2나누기 -> 1빼기의 차례대로 연산을 사용하는 횟수가 적어질 것이다.
따라서 우선 dp[n]을 dp[n-1] + 1인 경우로 저장하고, 2의 배수이면 dp[n/2] + 1, 3의 배수이면 dp[n/3] + 1 으로 계산해준다.
코드
import kotlin.math.min
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val num = br.readLine().toInt()
val dp = IntArray(num + 1)
for(i in 2 .. num) {
dp[i] = dp[i-1] + 1
if(i%2==0) dp[i] = min(dp[i], dp[i/2] + 1)
if(i%3==0) dp[i] = min(dp[i], dp[i/3] + 1)
}
bw.write("${dp[num]}")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1929번: 소수 구하기 - Kotlin[코틀린] (0) | 2023.07.18 |
---|---|
[백준] 2751번: 수 정렬하기 2 - Kotlin[코틀린] (0) | 2023.07.17 |
[백준] 1316번: 그룹 단어 체커 - Kotlin[코틀린] (0) | 2023.07.17 |
[백준] 10828번: 스택 - Kotlin[코틀린] (0) | 2023.07.15 |
[백준] 1065번: 한수 - Kotlin[코틀린] (0) | 2023.07.14 |