728x90
출처-https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
728x90
내가 푼 방식
:1에서 n에 접근하기 위한 최단거리를 구해준다.
dp[1]~dp[n]인 배열을 생성한다.
i가 1부터 시작해서 n까지 i (+1 or *2 or *3) 해서
최단 루트로 n에 도달할 수 있는 경우의 수를 찾는다.
DP 관련 문제 중 첫번째로 풀었던 문제.
이 문제를 풀 때까지만 해도 DP 개념이 이해가 잘 안 됐었다.
그래서 보기 편하게 표로 과정을 나타내 봤다.
이렇게 한번 그려보고 나니까 머릿속이 정리가 됐다.
다음 DP 풀 때부터는 이걸 바탕으로 머리로 그려보며 풀어서 좀 더 수월했다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int dp[]=new int[n+1]; //index 1~n까지 사용 (index 0은 무시)
for (int i=1;i<=n;i++) { //i가 1부터 n까지 1씩 증가하며 반복
if (i+1<=n) { // +1을 하는 경우 (n을 넘어가면 안된다.)
if (dp[i+1]==0) //i+1한 곳에 아직 한 번도 접근하지 않았다면
dp[i+1]=dp[i]+1; //dp[i]에서 +1
else //이미 이곳에 접근한 적이 있다면
if (dp[i+1]>=dp[i]+1) //더 최단거리로 접근했을 때의 수를 저장
dp[i+1]=dp[i]+1;
}
if (i*2<=n) { //*2를 하는 경우 (n을 넘어가면 안된다.)
if (dp[i*2]==0)
dp[i*2]=dp[i]+1;
else
if (dp[i*2]>=dp[i]+1)
dp[i*2]=dp[i]+1;
}
if (i*3<=n) { //*3을 하는 경우 (n을 넘어가면 안된다.)
if (dp[i*3]==0)
dp[i*3]=dp[i]+1;
else
if (dp[i*3]>=dp[i]+1)
dp[i*3]=dp[i]+1;
}
}
System.out.println(dp[n]);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 11727] 2xn 타일링 2 (java) (0) | 2020.07.27 |
---|---|
[백준, BOJ 11726] 2xn 타일링 (java) (0) | 2020.07.27 |
[백준, BOJ 10952] A+B -5 (java) (0) | 2020.07.21 |
[백준, BOJ 10951] A+B -4 (java) (0) | 2020.07.21 |
[백준, BOJ 10950] A+B -3 (java) (0) | 2020.07.21 |