반응형
- 알고리즘 분류 : 다이나믹 프로그래밍, Bottom-Up 방식
- 사용 언어 : JAVA
- 문제 요점
- 주어진 수를 아래의 연산을 반복하여 1로 만들기
- 1을 빼기
- 2로 나누기
- 3으로 나누기
- 1로 만드는 연산 횟수가 가장 적은 횟수를 출력
- 점화식 도출
int min = d[i-1] + 1;
if(i % 2 == 0) {
min = Math.min(min, d[i/2] + 1);
}
if(i % 3 == 0) {
min = Math.min(min, d[i/3] + 1);
}
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 각 숫자 별 횟수
int[] d = new int[N+1];
// 1이 만드려는 수이기에 횟수 0
d[1] = 0;
// N이 1일수도 있으니 오류 방지용으로 조건문
if(N>1) {
// 2에서 1로 만드는 연산은 1번 필요
d[2] = 1;
}
// N이 1 or 2 일 수도 있으니 오류 방지용으로 조건문
if(N>2) {
// 3에서 1로 만드는 연산은 1번 필요
d[3] = 1;
}
// 4부터 N까지 반복
for(int i=4; i<=N; i++) {
//1을 더해주는 연산
int min = d[i-1] + 1;
// 2로 나누어 진다면 2로 나눈 연산
if(i % 2 == 0) {
min = Math.min(min, d[i/2] + 1);
}
// 3으로 나누어 진다면 3으로 나눈 연산
if(i % 3 == 0) {
min = Math.min(min, d[i/3] + 1);
}
// 위 세 연산 중 가장 연산 횟수가 적은걸 채택
d[i] = min;
}
// 결과 출력
System.out.println(d[N]);
}
}
반응형
'Algorithm' 카테고리의 다른 글
[이것이 코딩테스트다] 8. 최단 경로 - 실전 문제 풀이 (0) | 2022.02.01 |
---|---|
[BAEKJOON] 1003번 : 피보나치 함수 (JAVA) (0) | 2022.02.01 |
[이것이 코딩테스트다] 8. 최단 경로 (0) | 2022.01.31 |
[BAEKJOON] 10844번 : 쉬운 계단 수 (JAVA) (0) | 2022.01.30 |
[BAEKJOON] 11726번 : 2xn 타일링 (JAVA) (0) | 2022.01.30 |