1463๋ฒ: 1๋ก ๋ง๋ค๊ธฐ
์ฒซ์งธ ์ค์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 106๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์ N์ด ์ฃผ์ด์ง๋ค.
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
์ด ๋ฌธ์ ๋ ํฌ๊ฒ 3๊ฐ์ง ์กฐ๊ฑด์ด ํ์ํ๋ค.
- X๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 3์ผ๋ก ๋๋๋ค.
- X๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 2๋ก ๋๋๋ค.
- 1์ ๋บ๋ค
์ด ์กฐ๊ฑด์ ํ ๋๋ก 1๋ก ๋ง๋ค๊ธฐ ์ํ ์ต์ ์ฐ์ฐ ํ์๋ฅผ ์ฐพ์๋ด์ผ ํ๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ๋ฌด์กฐ๊ฑด "ํฐ์๋ก ๋๋ ์๋ ์๋๋ค"
Integer[] dp; // ๋ฉ๋ชจ์ด์ ์ด์
ํ ๋ฐฐ์ด
static int recur(int N) {
// ํ์ํ์ง ์์๋ N์ผ ๊ฒฝ์ฐ
if (dp[N] == null) {
// 6์ผ๋ก ๋๋ ์ง ๊ฒฝ์ฐ
if (N % 6 == 0) {
}
// 3์ผ๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (N % 3 == 0) {
}
// 2๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (N % 2 == 0) {
}
// 2์ 3์ผ๋ก ๋๋์ด์ง์ง ์๋ ๊ฒฝ์ฐ
else {
}
}
return dp[N];
}
๊ฐ ๋ถ๋ถ์ ์ฌ๊ทํธ์ถ์ ํ๋ฉด์ DP๋ฅผ ์ต์๊ฐ์ผ๋ก ๊ฐฑ์ ํด์ฃผ์ด์ผ ํ๋ค. ์ด ๋ ๋ฌด์กฐ๊ฑด ํฐ์๋ก ๋๋ ๊ฐ์ด ๋ฌด์กฐ๊ฑด ์ต์๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์กฐ์ฌํด์ผ ํ๋ค.
์ฆ, 6์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ๋ 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ์ 2๋ก ๋๋๋ ๊ฒฝ์ฐ, 1์ ๋นผ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฌ๊ทํธ์ถํ์ฌ 3๊ฐ์ง ๊ฒฝ์ฐ ์ค ์ต์๊ฐ์ผ๋ก DP๋ฅผ ๊ฐฑ์ ํด์ผ ํ๊ณ , 3์ผ๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ๋ 3์ผ๋ก ๋๋๋๊ฒฝ์ฐ์ 1์ ๋นผ๋ ๊ฒฝ์ฐ๋ฅผ ์ฌ๊ทํธ์ถ, 2๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ๋ 2๋ก ๋๋๋ ๊ฒฝ์ฐ์ 1์ ๋นผ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฌ๊ทํธ์ถ, ๊ทธ ์ธ์๋ 1์ ๋นผ๋ ๊ฒฝ์ฐ๋ง ์ฌ๊ทํธ์ถ์ ํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ถ๋ถ์ ์ด์ ์ฌ๊ทํธ์ถ ์ค ์ต์๊ฐ์ 1์ ๋ํ ๊ฐ์ด ํ์ฌ N์ ๋ํ ์ต์์ฐ์ฐ ํ์๊ฐ ๋๋ค.
[์๊ณ ๋ฆฌ์ฆ1]
Integer[] dp; // ๋ฉ๋ชจ์ด์ ์ด์
ํ ๋ฐฐ์ด
static int recur(int N) {
if (dp[N] == null) {
// 6์ผ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ
if (N % 6 == 0) {
dp[N] = Math.min(recur(N - 1), Math.min(recur(N / 3), recur(N / 2))) + 1;
}
// 3์ผ๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (N % 3 == 0) {
dp[N] = Math.min(recur(N / 3), recur(N - 1)) + 1;
}
// 2๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (N % 2 == 0) {
dp[N] = Math.min(recur(N / 2), recur(N - 1)) + 1;
}
// 2์ 3์ผ๋ก ๋๋์ด์ง์ง ์๋ ๊ฒฝ์ฐ
else {
dp[N] = recur(N - 1) + 1;
}
}
return dp[N];
}
[์๊ณ ๋ฆฌ์ฆ 2]
static int recur(int N, int count) {
if (N < 2) {
return count;
}
/*
N์ผ๋ก ๊ฐ๊ฐ 2์ 3์ผ๋ก ๋๋๋ฉด count๋ +1์ ๊ฐ ์ฐ์ฐ์
๋๋จธ์ง ๊ฐ์ ๋ํด์ค ๊ฒ์ด ๋๋ค.
๋๋จธ์ง ๊ฐ์ ๋นผ๊ธฐ 1ํ์ ๋์ count ๊ฐ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ
*/
return Math.min(recur(N / 2, count + 1 + (N % 2)), recur(N / 3, count + 1 + (N % 3)));
}
DP๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ์ดํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ์์ ์ฌ๊ท ํธ์ถํ ๋ ๊ฐ์ด ์ฐ์ฐ ํ์๋ฅผ ๊ฐ์ด ๊ฐฑ์ ์ํค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ํด์ N=1 ์ด ๋๊ธฐ ์ ๊น์ง count๋ฅผ ๋์ ํ๋ค๊ฐ 1์ด ๋๋ฉด ๋์ ๋ count๋ฅผ ๋ฐํํ์ฌ ์ฌ๊ท๋ฅผ ํ์ถ์ํค๋ ๊ฒ์ด๋ค.
์๋ฅผ๋ค์ด N์ด 5๋ผ๊ณ ํ ๋, 5->4->2->1 ๋ก ์ด 3์ด ๋๋ค.
์ ์์์ ์๋ฆฌ๋ก ๋ณด์๋ฉด ์ด๋ ๋ค. recur(N/2, count +1 + (N%2))๋ฅผ ๋ณด์๋ฉด ์ด๋ ๊ฒ ๋๋ค.
N = 5, count = 0
N = 5 / 2 = 2, count = 0 + 1 + 1(๋๋จธ์ง๊ฐ)
N = 2 / 2 = 1, count = 2 + 1 + 0(๋๋จธ์ง ๊ฐ)
N = 1 ์ด๋ฏ๋ก return count -> 3์ด ๋ฐํ
๋ฌผ๋ก ๊ทธ ์์ recur(recur(N / 3, count + 1 + (N % 3)) ๋ ์์ผ๋ ์ ํํ๊ฒ ๋งํ์๋ฉด ์ด๋ ๊ฒ ๋๋ค.
recur(5,0)
min( recur(2,2) , recur(1, 2) )
min( min( recur(1, 3) , recur(0,5) ) , min( recur(0, 3), recur(0, 5) ) )
min( min( 3 , 5 ) , min( 3, 5 ) )
min( 3, 3 )
output : 3
ํ์ด ๋ฐ ์ฝ๋
- ๋ฐฉ๋ฒ 1 : [Scanner + ์๊ณ ๋ฆฌ์ฆ 1]
import java.util.Scanner;
public class Main {
static Integer[] dp;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
dp = new Integer[N + 1];
dp[0] = dp[1] = 0;
System.out.print(recur(N));
}
static int recur(int N) {
if (dp[N] == null) {
// 6์ผ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ
if (N % 6 == 0) {
dp[N] = Math.min(recur(N - 1), Math.min(recur(N / 3), recur(N / 2))) + 1;
}
// 3์ผ๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (N % 3 == 0) {
dp[N] = Math.min(recur(N / 3), recur(N - 1)) + 1;
}
// 2๋ก๋ง ๋๋ ์ง๋ ๊ฒฝ์ฐ
else if (N % 2 == 0) {
dp[N] = Math.min(recur(N / 2), recur(N - 1)) + 1;
}
// 2์ 3์ผ๋ก ๋๋์ด์ง์ง ์๋ ๊ฒฝ์ฐ
else {
dp[N] = recur(N - 1) + 1;
}
}
return dp[N];
}
}
- ๋ฐฉ๋ฒ 2 : [Scanner + ์๊ณ ๋ฆฌ์ฆ 2]
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)));
}
}