21.09.13 기록
백준 알고리즘 9184 풀이
🎆나의 오답…?(시간초과)
-해설과 같은 로직으로 풀이했는데 시간초과로 통과하지 못했다.🤷🏻♀️
-System.print.out 대신 BufferedWriter 를 사용해도 시간초과로 나왔다..
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B9184 {
public static final int MAX_RANGE = 20+1;
public static int[][][] dp = new int[MAX_RANGE][MAX_RANGE][MAX_RANGE];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
while(true) {
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) {
System.out.println(sb);
return;
}
sb.append("w(").append(a).append(", ").append(b).append(", ").append(c).append(") = ").append(w(a,b,c)).append("\n");
}
}
public static int w(int a, int b, int c) {
if(inRange(a, b, c) && dp[a][b][c] != 0) {
return dp[a][b][c];
}
if(a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if (a > 20 || b > 20 || c > 20) {
return dp[20][20][20] = 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);
}
public static boolean inRange(int a, int b, int c) {
return 0 <= a && a <= 20 && 0 <= b && b <= 20 && c <= 0 && c <= 20;
}
}