반응형
9184번 - 신나는 함수 실행
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
static int[][][] dp = new int[51][51][51]; // dp값을 저장할 배열 선언
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 a = 0, b = 0, c = 0;
while (true) {
String[] inputs = br.readLine().split(" ");
a = Integer.parseInt(inputs[0]);
b = Integer.parseInt(inputs[1]);
c = Integer.parseInt(inputs[2]);
if (a == -1 && b == -1 && c == -1) { // a = b = c = -1일 경우 반복문 탈출
break;
}
int result = w(a, b, c);
StringBuilder sb = new StringBuilder();
sb.append("w(").append(a).append(", ").append(b).append(", ").append(c).append(") = ").append(result);
bw.write(sb.toString());
bw.newLine();
}
bw.flush();
bw.close();
}
private static int w(int a, int b, int c) {
if (a <= 0 || b <= 0 || c <= 0)
return 1;
if (dp[a][b][c] != 0) {
return dp[a][b][c];
}
if (a > 20 || b > 20 || c > 20) {
return w(20, 20, 20);
}
if (a < b && b < c) {
return dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
return dp[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
}
정답을 맞춘 풀이방법
1. DP문제로 재귀적인 방법을 사용하기 위해 미리 배열을 선언함
2. DP[][][]배열에 w함수를 실행하고 이때 이미 계산한 DP값이 존재할경우 값을 반환한다.
전형적인 DP문제로 Bottom-up 방식으로 자주 풀다보니 재귀적 방법은 다소 어려웠음ㅠㅠ
반응형
'알고리즘 > 백준 문제[추후 옮길예정]' 카테고리의 다른 글
[JAVA] 백준 9461번 (0) | 2021.06.18 |
---|---|
[JAVA] 백준 1904번 (0) | 2021.06.17 |
[JAVA] 백준 1748번 (0) | 2021.06.05 |
[JAVA] 백준 1476번 (0) | 2021.06.04 |
[JAVA] 백준 2309번 (0) | 2021.06.03 |