1로 만들기 분류
시간 제한메모리 제한제출정답맞은 사람정답 비율
0.5 초 | 128 MB | 129803 | 41522 | 26192 | 32.038% |
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
1
예제 입력 2 복사
10
예제 출력 2 복사
3
백준 DP 기초 문제입니다. 다이나믹 프로그래밍은 top-down 방식과 botton-up 방식이 있는데
top-down은 재귀적으로 푸는 방식이고, botton-up은 for문을 이용해 푸는 방식입니다. 저는 top-down 방식을 이용하였습니다.
연산을 할 수 있는 경우는 3가지가 있기 때문에
1. i가 3으로 나누어 떨어졌을 때, 3으로 나누는 경우
• D[i/3] + 1
2. i가 2로 나누어 떨어졌을 때, 2로 나누는 경우
• D[i/2] + 1
3. i에서 1을 빼는 경우
• D[i-1] + 1
• 세 값중의 최소값이 들어가게 됩니다.
import java.util.Scanner;
public class baekjoon1463 {
public static int[] d;
public static int go(int n) {
if (n == 1) return 0;
if (d[n] > 0) return d[n];
d[n] = go(n-1) + 1;
if (n % 2 == 0) {
int temp = go(n/2) + 1;
if (d[n] > temp) d[n] = temp;
}
if (n % 3 == 0) {
int temp = go(n/3) + 1;
if (d[n] > temp) d[n] = temp;
}
return d[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
d = new int[n + 1];
System.out.println(go(n));
sc.close();
}
}
'알고리즘' 카테고리의 다른 글
백준_1003 (0) | 2021.02.09 |
---|---|
백준_10451번 (0) | 2021.02.09 |
SelectionSort (0) | 2020.12.22 |
프로그래머스 Lv 3 게임아이템 (1) | 2020.06.23 |
프로그래머스 Level 2 더 맵게 (0) | 2020.06.19 |