[백준] 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];
}
}
'알고리즘' 카테고리의 다른 글
[백준] 2908번 : 상수 -JAVA (2) | 2024.11.15 |
---|---|
[백준] : 1152번 - 단어의 개수 - JAVA (0) | 2024.11.15 |
[백준] 26041번 : 비슷한 전화번호 표시 - JAVA (0) | 2024.11.15 |
[백준] 2675번 : 문자열 반복 - JAVA (1) | 2024.11.15 |
[백준] 10994번 : 별 찍기 - JAVA (0) | 2024.11.14 |
[백준] 25501번 : 재귀의 귀재 - JAVA (1) | 2024.11.14 |
[백준] 24416번 : 알고리즘 수업 피보나치 수 1 - JAVA (0) | 2024.11.14 |
[백준] 2167번 : 2차원 배열의 합 - JAVA (0) | 2024.11.13 |