1로 만들기 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율
0.15 초 (하단 참고) | 128 MB | 157328 | 49762 | 31505 | 31.743% |
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
1
예제 입력 2 복사
10
예제 출력 2 복사
3
힌트
10의 경우에 10 -> 9 -> 3 -> 1 로 3번 만에 만들 수 있다.
출처
- 문제를 번역한 사람: baekjoon
- 문제의 오타를 찾은 사람: cyj101366, jugol
- 어색한 표현을 찾은 사람: dbfldkfdbgml
- 데이터를 추가한 사람: dynamiseus, jooa7878
알고리즘 분류
시간 제한
- Python 3: 1.5 초
- PyPy3: 0.7 초
- Python 2: 1.5 초
- PyPy2: 0.7 초
이 문제를 푼 알고리즘은
숫자 횟수
1 -> 0
2 -> 1
3 -> 1
4 -> 4/2 = 2 로 나누는 경우(1번) + DP[2]=1 => 2
5 -> 5-1=4 (1번) + DP[4]=2 => 3번
이런식으로 이미 앞에서 계산된 정보를 배열에 저장해서 계속 사용하는 것이 DP의 포인트 이다.
그래서 수도 코드 느낌으로? 한번 코드를 짰는데,
N = 주어진 숫자
DP[N-1]+1
if(N%2==0)
DP[N/2]+1
if(N%3==0)
DP[N/3]+1
DP[N]=파란색 글자중에 가장 작은수
이런식으로 작성했다.
아래는 위 수도코드를 바탕으로 코딩을 한 것 이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
val br = BufferedReader(InputStreamReader(System.`in`))
fun main()=with(br){
val bw = BufferedWriter(OutputStreamWriter(System.out))
val N = readLine()!!.toInt()
var DP = IntArray(N+1,{0})
// var arr1 = intArrayOf(1, 2, 3, 4)
// var array = Array(3, { Array(4, {0}) })
// var aa = Array<String>(2,{""})
var ans = IntArray(3){0}
DP[1]=0
for(i in 2 .. N){
//println("si")
ans[0]=Int.MAX_VALUE
ans[1]=Int.MAX_VALUE
ans[2]=Int.MAX_VALUE
ans[0]=DP[i-1]+1
if(i%2==0){
ans[1]=DP[i/2]+1
}
if(i%3==0){
ans[2]=DP[i/3]+1
}
//println(ans)
DP[i]= ans.minByOrNull { it }!!
}
bw.write("${DP[N]}")
bw.flush()
bw.close()
}
|
cs |
처음에는 DP 배열을 MutableList로 선언을 했었는데 속도가 느리길래 IntArray로 바꿨다.
'알고리즘 공부 > 미분류' 카테고리의 다른 글
백준 11399번 with 코틀린 (0) | 2021.07.23 |
---|---|
백준 9095번 with Kotiln (0) | 2021.07.23 |
백준 1003번 피보나치 수열 with Kotlin #DP (0) | 2021.07.23 |
백준 18111번 with Kotlin (0) | 2021.07.22 |
백준 15829번 with Kotlin (0) | 2021.07.22 |