[백준9184][JAVA][DP]신나는 함수 실행

Boknami·2023년 8월 28일
0

백준문제풀이

목록 보기
27/45

그렇게 어려운 문제는 아니었는데..그냥 멍청하게 풀었다.
단계별로 풀기 안에 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라는 함수를 만들어 에러 상황에 대한 대응도 잘 되어있다.

📌기억하자.

  • 문제 분석이 확실하게 끝난 후 코드로 접근하자
  • 뭔가 너무 길어지고 이상해진다 싶으면 한 번쯤 다시 생각을..

0개의 댓글