그렇게 어려운 문제는 아니었는데..그냥 멍청하게 풀었다.
단계별로 풀기 안에 DP문제였기 때문에 DP를 사용한다는 걸 알고 풀었는데도 이상하게 문제를 접근했다.
import java.io.IOException;
import java.util.Scanner;
public class Main {
static int[][][] table = new int[101][101][101];
public static int w(int a, int b, int c){
//테이블에 이미 저장되어 있다면 계산 없이 바로 그 값
//계산 안되어있으면 테이블에 값 저장
if(a <= 0 || b <= 0 || c <= 0){
if(table[a+50][b+50][c+50] == 0){
table[a+50][b+50][c+50] = w(a+50, b+50, c+50);
}
return 1;
}
if(a > 20 || b > 20 || c > 20) {
if(table[a+50][b+50][c+50] == 0){
table[a+50][b+50][c+50] = w(a+50, b+50, c+50);
}
return table[70][70][70];
}
if(a < b && b < c){
int sum = 0;
if(table[a+50][b+50][c+50] == 0){
table[a+50][b+50][c+50] = w(a+50, b+50, c+50);
}
if(table[a+50][b+50][c+49] == 0){
table[a+50][b+50][c+49] = w(a+50, b+50, c+49);
}
sum += table[a+50][b+50][c+49];
if(table[a+50][b+49][c+49] == 0){
table[a+50][b+49][c+49] = w(a+50, b+49, c+49);
}
sum += table[a+50][b+49][c+49];
if(table[a+50][b+49][c+50] == 0){
table[a+50][b+49][c+50] = w(a+50, b+49, c+50);
}
sum -= table[a+50][b+49][c+50];
return sum;
}
else{
int sum = 0;
if(table[a+49][b+50][c+50] == 0){
table[a+49][b+50][c+50] = w(a+49, b+50, c+50);
}
sum += table[a+49][b+50][c+50];
if(table[a+49][b+49][c+50] == 0){
table[a+49][b+49][c+50] = w(a+49, b+49, c+50);
}
sum+= table[a+49][b+49][c+50];
if(table[a+49][b+50][c+49] == 0){
table[a+49][b+50][c+49] = w(a+49, b+50, c+49);
}
sum += table[a+49][b+50][c+49];
if(table[a+49][b+49][c+49] == 0){
table[a+49][b+49][c+49] = w(a+49, b+49, c+49);
}
sum -= table[a+49][b+49][c+49];
return sum;
}
}
public static void main(String args[]) throws IOException{
Scanner in=new Scanner(System.in);
while(true) {
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
if (a == -1 && b == -1 && c == -1) {
break;
}
System.out.printf("w(%d, %d, %d) = %d\n", a, b, c, w(a, b, c));
}
}
}
말도 안 되게 비효율적이다..코드가 88줄이었고 심지어 제대로 실행도 안되었다. 문제를 푸는 동안에도 의구심이 조금 들긴했는데 비효율적이더라도 일단 값이 잘 나오게라도 해보자라는 마음으로 이렇게 구성했는데 애초에 문제를 제대로 분석을 안했다.
문제 제한에서 a,b,c가 -50~50이라길래 100의 크기를 가지는 3차원 배열을 선언하고 주어지는 a,b,c 값에 기본적으로 +50씩해서 계산해보자라는 생각을 가져었다. 생각보다 나쁘지는 않은 접근 방법이었다고 생각은 하는데..
애초에 문제에서 20보다 큰 경우 그냥 정해진 값을 반환해버린다..즉 20보다 큰 수는 생각할 필요가 없다는 것이다 ㅠㅠ
import java.io.IOException;
import java.util.Scanner;
public class Main {
static int[][][] table = new int[21][21][21];
static int w(int a, int b, int c) {
if(inRange(a, b, c) && table[a][b][c] != 0) {
return table[a][b][c];
}
if(a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if(a > 20 || b > 20 || c > 20) {
return table[20][20][20] = w(20, 20, 20);
}
if(a < b && b < c) {
return table[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
return table[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);
}
static boolean inRange(int a, int b, int c) {
return 0 <= a && a <= 20 && 0 <= b && b <= 20 && 0 <= c && c <= 20;
}
public static void main(String args[]) throws IOException{
Scanner in=new Scanner(System.in);
while(true) {
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
if (a == -1 && b == -1 && c == -1) {
break;
}
System.out.printf("w(%d, %d, %d) = %d\n", a, b, c, w(a, b, c));
}
}
}
https://st-lab.tistory.com/190
해당 블로그가 어떠한 문제든 잘 설명해주고 여러 풀이 방법들을 소개시켜줘서 좋은 것 같다. 아무튼 20이상의 경우에도 잘 처리를 해주시고 a,b,c의 값들이 -인 경우도 있는데 이 때 인덱스 에러가 나지 않도록 inRange라는 함수를 만들어 에러 상황에 대한 대응도 잘 되어있다.