Programming/algorithm
백준 1463 자바 dp 풀이 and bfs 풀이
flcat
2020. 7. 19. 12:56
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
Top-down은 가장 큰 문제를 방문 후 작은 문제를 호출하여 답을 찾는 방식이고,
Bottom-up은 가장 작은 문제들 부터 답을 구해가며 전체 문제의 답을 찾는 방식이다.
흔히 top-down은 재귀 호출을, bottom-up은 반복문을 이용해 구현한다.
Top-down 방식은 점화식을 이해하기 쉽다는 장점이 있고, Bottom-up 방식은 함수를 재귀 호출하지 않기 때문에 시간과 메모리 사용량을 줄일 수 있다는 장점이 있다.
우선 D[j]를 구한다고 해보자 (1<j<=N)
예외처리 (0과 1) (D[0] = 0, D[1] = 0;)
반복문은 2부터 N까지 진행. (여기부터 dp)
D[N]를 구할때 가능한 연산이 3가지 인데.
1을 빼는 것
j 를 만드는 방법은
j / 2 에서 2를 곱하는 방법과
j / 3 에서 3을 곱하는 방법과
j - 1 에서 1을 더하는 방법이 있다
따라서 저 세가지 방법중 적은 횟수로 만들 수 있는 녀석을 골라서 그 녀석에서 한 번의 추가적인 연산을 통해
j 를 만드는것이 최적이다
Bottom-up 방식 풀이 코드는 아래와 같다
import java.io.*;
public class t1463 {
static int[] d;
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());
d = new int[N + 1];
d[0] = 0;
d[1] = 0;
dp(N);
bw.write(d[N] + "");
br.close();
bw.flush();
bw.close();
}
private static int dp(int n) {
for (int i = 2; i <= n; i++) {
d[i] = d[i - 1] + 1;
if (i % 2 == 0) {
d[i] = Math.min(d[i], d[i / 2] + 1);
}
if (i % 3 == 0) {
d[i] = Math.min(d[i], d[i / 3] + 1);
}
}
return n;
}
}
bfs 추가 중.