728x90
문제 흐름
- 문제 목표
- 숫자 n이 주어졌을 때, 숫자 1, 2, 을 사용해 그 합이 이 되는 모든 경우의 수를 계산합니다.
- 입력 및 출력 설명
- 여러 테스트 케이스에 대해 각각의 숫자 을 입력받고, 각 경우에 대해 결과를 출력합니다.
핵심 아이디어
- 동적 프로그래밍(DP)
- 현재 숫자 i를 만들기 위해 마지막에 추가하는 숫자가 , , 또는 일 때의 경우를 합산합니다.
- 점화식: arr[i] = arr[i-1] + arr[i-2] + arr[i-3]
- 여기서 arr[i]는 숫자 를 만드는 경우의 수를 나타냅니다.
- 이 문제는 미리 계산된 DP 배열에서 결과를 빠르게 조회하는 방식으로 해결할 수 있습니다.
알고리즘 흐름
- DP 배열 초기화
- arr[0]=1로 초기화합니다.
- 배열을 통해 1부터 까지의 결과를 미리 계산합니다.
- DP 배열 채우기
- 각 숫자 i를 이전 3개의 합을 통해 구합니다.
- 결과 출력
- 미리 계산된 DP 배열에서 주어진 숫자에 해당하는 값을 출력합니다.
정답은 더보기 클릭
더보기
import java.util.*;
import java.io.*;
public class Main {
static int N; // 테스트 케이스 수
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
N = in.nextInt(); // 테스트 케이스 수 입력
int[] arr = new int[11]; // DP 배열 선언, 최대 10까지 미리 계산
arr[0] = 1; // 기본 초기화: 숫자 0을 만드는 방법은 1가지 (아무것도 선택하지 않는 경우)
// DP 배열 채우기
for (int i = 1; i < 11; i++) {
int sum = 0;
// 마지막에 더해지는 숫자가 1, 2, 3인 경우를 각각 추가
if (i >= 1) sum += arr[i - 1];
if (i >= 2) sum += arr[i - 2];
if (i >= 3) sum += arr[i - 3];
arr[i] = sum; // i를 만드는 경우의 수 저장
}
// 각 테스트 케이스에 대해 결과 출력
for (int i = 0; i < N; i++) {
System.out.println(arr[in.nextInt()]);
}
}
}
728x90
'백준' 카테고리의 다른 글
[백준] 연속합 (1912번) (0) | 2024.10.31 |
---|---|
[백준] 토마토 (7576번) (0) | 2024.10.30 |
[백준] 부분합 (1806번) (0) | 2024.10.29 |
[백준] 단지번호붙이기 (2667번) (0) | 2024.10.29 |
[백준] 스타트와 링크 (14889번) (0) | 2024.10.27 |