티스토리 뷰

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* Created by kgh on 2018. 8. 18.
* Blog : http://kgh940525.tistory.com
* Github : http://github.com/kgh940525
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 49603 16098 10473 32.213%
문제
정수 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번 만에 만들 수 있다.
*/
public class Baekjoon_1463_Recursive {
public static int D[];

public static int make(int num){
// comment: num == 1 일경우 종료(조건만족)
if(num == 1){
return 0;
}
// comment: 0보다 큰수로 연산시키기 위한 조건
if(D[num]> 0){
return D[num];
}

// comment: 1) 1로 만들어 줄 경우 , -1
D[num] = make(num-1)+1 ;

// comment: 2) N/2 경우, D[N/2]+1
if(num%2==0){
int result = make(num/2)+1;
// comment: D[num]보다 num/2이 최소값일경우
if(D[num] > result){
D[num] = make(num/2)+1;
}
}
// comment: 3) N/3 경우 , D[N/3]+1
if(num%3==0){
int result = make(num/3)+1;
// comment: D[num]보다 num/3이 최소값일경우
if(D[num] > result) {
D[num] = make(num/3)+1;
}
}

// comment: return D[num]
return D[num];
}

public static void main(String args[]) throws IOException {
// comment: Variable Declear
int num = 0;

// comment: num Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
num = Integer.parseInt(br.readLine());

// comment: D Array num + 1 , 배열에 값 할당 안하면 기본적으로 0이 할당된다.
D = new int[num+1];

// comment: make call
System.out.print(make(num));
}
}


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함