알고리즘/BOJ

[BOJ] 9184. 신나는 함수 실행

재담 2022. 3. 29. 01:19

문제 원본 : https://www.acmicpc.net/problem/9184

 

9184번: 신나는 함수 실행

입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.

www.acmicpc.net

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static int[][][] w = new int[101][101][101];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int a, b, c;
        StringTokenizer st = null;
        StringBuilder builder = new StringBuilder();
        while (true) {
            String abc = br.readLine();

            if (abc.equals("-1 -1 -1")) {
                break;
            }

            st = new StringTokenizer(abc);
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            c = Integer.parseInt(st.nextToken());

            builder.append("w(").append(a).append(", ").append(b).append(", ").append(c).append(") = ").append(W(a + 50, b + 50, c + 50)).append("\n");
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }

    public static int W(int a, int b, int c) {
        if (w[a][b][c] > 0) {
            return w[a][b][c];
        }

        if (a <= 50 || b <= 50 || c <= 50) {
            return w[a][b][c] = 1;
        } else if (a > 70 || b > 70 || c > 70) {
            return w[a][b][c] = W(70, 70, 70);
        } else if (a < b && b < c) {
            return w[a][b][c] = W(a, b, c - 1) + W(a, b - 1, c - 1) - W(a, b - 1, c);
        } else {
            return w[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);
        }
    }
}
  • 다이내믹 프로그래밍 문제
  • 문제에서 주어진대로 memoization 하면서 재귀를 돌리면 풀린다.