๋ฐฑ์ค 1๋ก ๋ง๋ค๊ธฐ ๋ solved.ac ๊ธฐ์ค Tier : Silver3
์ด ๋ฌธ์ ๋ DP ๋ฌธ์ ๋ก ๋ถ๋ฅ๋๋ฉฐ DP ๋ฌธ์ ์ค ์ฌ์ด ํธ์ ์ํ๋ค.
DP ๋ฌธ์ ์ ํต์ฌ์ ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋๊ธฐ ์ด๋ฉฐ, ํด๋น ๋ฌธ์ ์๋ ์ ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค.
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋๊ธฐ ์ํด์๋ ๋ฌธ์ ์ ๋ณด์ด๋ ์ผ์ ํ ๊ท์น์ ์ฐพ์ ์ ํ์์ผ๋ก ๋์ถํ๋ ๊ณผ์ ์ด ํ์์ ์ด๋ค.
๋ฌธ์
์ ์ถ๋ ฅ
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
1๋ก ๋ง๋ค๊ธฐ ๋ฌธ์ ๋ ์ ์ x๋ฅผ ์ ๋ ฅ ๋ฐ๊ณ x๊ฐ 1์ด๋๊ธฐ ๊น์ง ์ต๋จ ํ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์๋ฌด๋ ๊ฒ๋ 1๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ด ์กด์ฌํ๋ค.
- x๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด 3์ผ๋ก ๋๋๋ค.
- x๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด 2๋ก ๋๋๋ค.
- x์ 1์ ๋บ๋ค.
์ด๋ฅผ ๊ธฐ์ค์ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋ง๋ค์ด๋ณด์.
๋ฌธ์ ๋ฅผ ์๊ฒํ๋ ๋ฐฉ๋ฒ
๋ฌธ์ ๋ฅผ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ ํฐ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ณ ์์ ๋ฌธ์ ๋ก ๋๋๋ ์๊ฐ์์ ์์ํ๋ค.
ํด๋น ๋ฌธ์ ์ ํ์ด ์์ d(n)
์ด๋ผ๊ณ ํ์ ๋, d(n) = ์
๋ ฅ n์ 1๋ก ๋ง๋๋ ์ต์ ํ์
๋ผ๊ณ ์ ์ํ ์ ์๋ค.
์ด์ ์ ๊ฐ์ ์์์ ๋งํ 1๋ก ๋ง๋๋ ๊ธฐ์ค์ ์ ์ฉ์์ผ๋ณด์.
-
x๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด 3์ผ๋ก ๋๋๋ค.
x/3 ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์ 1๋ฒ + x/3 ์ 1๋ก ๋ง๋๋ ๊ฒฝ์ฐ์ ์ x/3
-
x๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด 2๋ก ๋๋๋ค.
x/3 ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์ 1๋ฒ + x/3 ์ 1๋ก ๋ง๋๋ ๊ฒฝ์ฐ์ ์ x/3
-
x์ 1์ ๋บ๋ค.
x-1 ์ 1๋ก ๋ง๋๋ ๊ฒฝ์ฐ์ ์ x-1๋ฒ
์์ ์์ ๋ํ ์ต์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋กd[n] = d[n/3] + 1, d[n/2] + 1, d[n-1]
์ ์ต์๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
์ ํ์
์์ ํด๊ฒฐ ๊ณผ์ ์ ์ ํ์์ผ๋ก ๋ง๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.d[n] = min(d[n/3] + 1, d[n/2] + 1, d[n-1])
์์ค ์ฝ๋
package stage.stage11_DynamicPrograming;
import java.util.Scanner;
import java.io.*;
public class Prob02_MakeOne {
static int[] memo;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
memo = new int[n+1];
bw.write(dp(n) + "\n");
bw.flush();
bw.close();
}
private static int dp(int n){
if(n == 1) return 0; // minimum case
if(memo[n] > 0) return memo[n]; // duplication checker
memo[n] = dp(n-1) + 1; // this location is important.
if(n % 2 == 0){
int temp = dp(n/2) + 1;
if(memo[n] > temp) memo[n] = temp;
}
else if(n % 3 == 0){
int temp = dp(n/3) + 1;
if(memo[n] > temp) memo[n] = temp;
}
return memo[n];
}
}
๋๊ธ