-
728x90
DP - 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 11052
출처: https://plzrun.tistory.com/entry/알고리즘-문제풀이PS-시작하기 [plzrun's algorithm]hange Nxxxx -> Main && remove package lines!!!
이클립스에서 작성하면서 문제 이름으로 클래스를 생성하여 풀었기 때문에
클래스 이름을 Main으로 바꾸고, package 부분도 지우고 제출해야 정상적으로 돌아갑니다.
<풀이> - Bottom up
123456789101112131415161718192021222324252627282930package dp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class N9095 { //Bottom uppublic static void main(String[] args) throws NumberFormatException, IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int testn = Integer.parseInt(br.readLine());int d[] = new int[11];d[0] = 0;d[1] = 1;d[2] = 2;d[3] = 4;for(int i=0; i<testn; i++) {int n = Integer.parseInt(br.readLine());for(int j=4; j<n+1; j++) {d[j] = d[j-1] +d[j-2] +d[j-3];}System.out.println(d[n]);}}}Colored by Color Scripter<풀이> - Top down
123456789101112131415161718192021222324252627282930313233343536package dp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class N9095_TD {static int[] d;public static void main(String[] args) throws NumberFormatException, IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int testn = Integer.parseInt(br.readLine());d = new int[11];for(int i=0; i<testn;i++) {int n = Integer.parseInt(br.readLine());d[i] = calculate(n);System.out.println(d[i]);}}public static int calculate(int n) {if(n==1) return 1;else if(n==2) return 2;else if(n==3) return 4;else {d[n] = calculate(n-1) +calculate(n-2)+ calculate(n-3);return d[n];}}}Colored by Color Scriptercs 우선 점화식은 d[n] = d[n-1] +d[n-2] +d[n-3]이다.
점화식을 구하는 과정은 결국 하나하나 세보면서 구했는데,
나는 문제를 이상하게 읽었다...
1) 1, 2, 3 만으로 합을 구성하지 않고, 입력이 n이라면 n미만의 수로 합을 구성하는 방법인줄 알았다.
2) 1, 2, 3만으로 합을 구성하되, 자기 자신은 포함되지 않는줄 알았다.
ex. 입력이 2라면 1+1 한 가지 방법인줄... 2는 자기자신이므로 포함 X
그러나 문제에 수를 1개 이상 사용하면 된다고 명시되어 있다.
문제를 잘못 해석하지 않도록 유의해야 한다....
제대로 해석했다면 점화식을 구하는 과정이 크게 어렵지 않고, 다른 분들의 설명도 많다.
-----
구현측면에서도 이슈가 발생했는데, d[]의 크기를 동적으로 결정하려 했는데 런타임 에러가 발생했다.
정적으로 결정하지 않으려면 test case의 수를 받고나서 바로 d[]를 정의하는게 아니라, 케이스를 받고 나서
그 이후에 d[]를 정의하는 방법이 있는데,
문제는 그렇게 하면 동적 프로그래밍의 핵심 이점이 사라진다. 연산의 시간복잡도를 줄이기 위해 d[]를 만들어 값을 저장하는데,
case를 받을때마다 d[]를 만들었다가 다 지우고 다시 연산을 해야하기 때문에 효과적인 프로그래밍이 아니다.
이를 해결하기 위해서는 꽤나 골치아플 것 같은데 이번 문제에서는 정적으로 해결하고 넘어갔다...
(혹시 해결 방법을 아시는 분은 댓글 부탁드립니다...)
Github: https://github.com/jaeuk9407/AlgorithmBOJ
'Algorithms' 카테고리의 다른 글
[백준 알고리즘] (DP) 11057번 Java 풀이 (0) 2020.03.15 [백준 알고리즘] (DP)10844번 Java 2가지 풀이 (0) 2020.03.14 [백준 알고리즘] (DP) 11727번 Java 풀이 (0) 2020.03.11 [백준 알고리즘] (DP) 11726번 Java 풀이 (0) 2020.03.11 [백준 알고리즘] (DP) 1463번 Java 풀이 (0) 2020.03.10 댓글