๋ฌธ์
์ ์ X์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ง ์ด๋ค.
- X๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 3์ผ๋ก ๋๋๋ค.
- X๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 2๋ก ๋๋๋ค.
- 1์ ๋บ๋ค.
์ ์ N์ด ์ฃผ์ด์ก์ ๋, ์์ ๊ฐ์ ์ฐ์ฐ ์ธ ๊ฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ 1์ ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ฐ์ฐ์ ์ฌ์ฉํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ์์ค.
## ์ ๋ ฅ
์ฒซ์งธ ์ค์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 106๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์ N์ด ์ฃผ์ด์ง๋ค.
## ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฐ์ฐ์ ํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ด
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
์ด ๋ฌธ์ ๋ ์ฌ๊ท๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํ์ดํด์ผํ๋ค. ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด 3๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ณผ์์๋ค.
- 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ
- 2๋ก ๋๋๋ ๊ฒฝ์ฐ
- 1์ ๋นผ๋ ๊ฒฝ์ฐ
- 6์ผ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ
์ฆ, 6์ผ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ๋ 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ์ 2๋ก ๋๋๋ ๊ฒฝ์ฐ, 1์ ๋นผ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฌ๊ทํธ์ถ ํ์ฌ 3๊ฐ์ง ๊ฒฝ์ฐ ์ค ์ต์๊ฐ์ผ๋ก DP๋ฅผ ๊ฐฑ์
3์ผ๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ๋ 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ์ 1์ ๋นผ๋ ๊ฒฝ์ฐ๋ฅผ ์ฌ๊ทํธ์ถ
2๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ๋ 2๋ก ๋๋๋ ๊ฒฝ์ฐ์ 1์ ๋นผ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฌ๊ทํธ์ถ
๊ทธ ์ธ์๋ 1์ ๋นผ๋ ๊ฒฝ์ฐ๋ง ์ฌ๊ทํธ์ถ์ ํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๋ถ๋ถ์ ์ด์ ์ฌ๊ท ํธ์ถ ์ค ์ต์๊ฐ์ 1์ ๋ํ ๊ฐ์ด ํ์ฌ N์ ๋ํ ์ต์ ์ฐ์ฐํ์๊ฐ ๋๋ค.
์ด๋ฅผ dp ๋ฐฐ์ด์ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ฉด์ ๊ฐ์ ๊ตฌํด ๋๊ฐ๋ค.
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _1๋ก๋ง๋ค๊ธฐ {
static Integer[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
dp = new Integer[n+1];
dp[0] = dp[1] = 0;
System.out.println(recursion(n));
br.close();
}
static int recursion(int n){
if(dp[n] == null){
//6์ผ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ
if(n % 6 == 0){
dp[n] = Math.min(recursion(n-1), Math.min(recursion(n/3), recursion(n/2)))+1;
}
//3์ผ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (n % 3 == 0) {
dp[n] = Math.min(recursion(n/3), recursion(n-1))+1;
}
//2๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (n % 2 == 0) {
dp[n] = Math.min(recursion(n/2), recursion(n-1))+1;
}
//์๋๋ ์ง๋ ๊ฒฝ์ฐ
else {
dp[n] = recursion(n-1)+1;
}
}
return dp[n];
}
}
๋ค๋ฅธ๋ฐฉ๋ฒ
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
System.out.println(recur(N, 0));
}
static int recur(int N, int count) {
// N์ด 2 ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ ๋์ ๋ count๊ฐ์ ๋ฐํ
if (N < 2) {
return count;
}
return Math.min(recur(N / 2, count + 1 + (N % 2)), recur(N / 3, count + 1 + (N % 3)));
}
}
๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ๋ฉด n-1์ ๊ฐ๋ ์ฌ๊ทํธ์ถํ์ง๋ง, ๋๋จธ์ง๊ฐ์ ์ด์ฉํ์ฌ count๋ฅผ ๊ฐฑ์ ํ๋ฉด ํจ์จ์ด ์ข๋ ์ข๋ค.