관리자 글쓰기
[백준] 9184번 : 신나는 함수 실행 - JAVA
2024. 11. 14. 14:22 - DoosanBaek

문제 분석 :

- w(a, b, c) 함수의 값을 효율적으로 계산

- 크기 가 클 경우 , 중복이 많아진다

제약 조건 :

-  입력범위 : -50 ≤ a, b, c ≤ 50

- 각 줄에 a, b, c가 주어지며, 최종 입력이 -1 -1 -1일 때 입력을 종료

의사 결정 :

- 입력을 받아 각 줄에 주어진 a, b, c 값을 저장

- -1 -1 -1 이 입력으로 오면 처리 종료

- 재귀 함수 구현

- 출력

추가 코드 설명

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Week02_04_BOJ_9184 {
    // 메모이제이션을 위한 3차원 배열 선언
    static int[][][] memoizationTable = new int[101][101][101];

    public static void main(String[] args) throws IOException {
        // 표준 입력을 받기 위해 BufferedReader 사용
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        // 결과 출력을 용이하게 하기 위해 StringBuilder 사용
        StringBuilder stringBuilder = new StringBuilder();

        // 입력을 무한루프를 돌며 처리
        while (true) {
            // 한 줄 입력을 받아 공백을 기준으로 분리
            StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            // 세 개의 정수 a, b, c 입력 받음
            int a = Integer.parseInt(stringTokenizer.nextToken());
            int b = Integer.parseInt(stringTokenizer.nextToken());
            int c = Integer.parseInt(stringTokenizer.nextToken());

            // 입력의 종료 조건 확인
            if (a == -1 && b == -1 && c == -1) {
                break; // 입력의 종료 조건을 만나면 루프 종료
            }

            // w(a, b, c) 함수 호출하여 결과 받기
            int result = w(a, b, c);
            // 결과를 포맷에 맞게 StringBuilder에 추가
            stringBuilder.append(String.format("w(%d, %d, %d) = %d\n", a, b, c, result));
        }

        // 최종 결과 출력
        System.out.print(stringBuilder.toString());
    }

    static int w(int a, int b, int c) {
        // a, b, c의 인덱스를 맞추기 위해 각각 50을 더함
        int indexA = a + 50;
        int indexB = b + 50;
        int indexC = c + 50;

        // 기본 조건: 세 값 중 하나라도 0 이하일 경우 1 반환
        if (a <= 0 || b <= 0 || c <= 0) {
            return 1;
        }

        // 값이 20을 초과하면 w(20, 20, 20) 반환
        if (a > 20 || b > 20 || c > 20) {
            return w(20, 20, 20);
        }

        // 이미 계산된 값이 메모이제이션 테이블에 있으면 그 값 반환
        if (memoizationTable[indexA][indexB][indexC] != 0) {
            return memoizationTable[indexA][indexB][indexC];
        }

        // a < b < c 조건에 따른 계산 및 메모이제이션 테이블 업데이트
        if (a < b && b < c) {
            memoizationTable[indexA][indexB][indexC] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
        } else {
            // 그 외의 경우 계산 및 메모이제이션 테이블 업데이트
            memoizationTable[indexA][indexB][indexC] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1);
        }

        // 계산된 값 반환
        return memoizationTable[indexA][indexB][indexC];
    }
}