코딩테스트
[코드그루] 94. 백준 9184번 : 신나는 함수 실행
hnajeahi
2024. 11. 28. 21:40
// fail
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static StringBuilder sb = new StringBuilder();
static int[] dp = new int[51];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
dp[0] = 1;
while(true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
if (a == -1 && b == -1 && c == -1) break;
dp[a + b + c] = wabc(a, b, c);
sb.append("w(" + a + ", " + b + ", " + c + ") = " + dp[a + b + c] + "\n");
}
System.out.println(sb);
}
public static int wabc(int a, int b, int c) {
if (a <= 0 || b <= 0 || c <= 0) {
return 1;
} else if (a > 20 || b > 20 || c > 20) {
return wabc(20, 20, 20);
} else if (a < b && b < c) {
return wabc(a, b, c - 1) + wabc(a, b - 1, c - 1) - wabc(a, b - 1, c);
} else {
return wabc(a - 1, b, c) + wabc(a - 1, b - 1, c) + wabc(a - 1, b, c - 1) - wabc(a - 1, b - 1, c - 1);
}
}
}
처음에 int[][][] dp로 풀까 하다가 그렇게는 또 어떻게 푸는지 모르겠다!! dp[a + b + c]들은 값이 다 같지 않을까 라는 멍청한 생각을 함.당연히 답이 안 나옴…
문제에 나온 조건 따라가되 이게 이래서 dp구나를 알게 됨.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static StringBuilder sb = new StringBuilder();
static int[][][] dp = new int[21][21][21];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// dp 배열 모든 값을 -1로 설정
for (int i = 0; i < 21; i++) {
for (int j = 0; j < 21; j++) {
for (int k = 0; k < 21; k++) {
dp[i][j][k] = -1;
}
}
}
while(true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
if (a == -1 && b == -1 && c == -1) break;
sb.append("w(").append(a).append(", ").append(b).append(", ").append(c).append(") = ")
.append(w(a, b, c)).append("\n");
}
System.out.println(sb);
}
public static int w(int a, int b, int c) {
if (a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if (a > 20 || b > 20 || c > 20) {
return w(20, 20, 20);
}
if (dp[a][b][c] != -1) { // 이미 계산된 값일 경우 리턴
return dp[a][b][c];
}
if (a < b && b < c) {
dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
} else {
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);
}
return dp[a][b][c];
}
}
다음에 이런 문제는 절대 안 틀려야지!!!!!!!
728x90