21.09.13 기록

최대 1 분 소요

백준 알고리즘 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;
    }
}


카테고리:

업데이트: