[백준] 9095번 1, 2, 3 더하기 JAVA (자바) 풀이
문제 9095번 (DP)
: 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지
합을 나타낼 때는 수를 1개 이상 사용
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
[입력]
: 첫째 줄에 테스트 케이스의 개수 T
각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다 ( n은 양수이며 11보다 작다)
[출력]
: 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력
[설명]
DP 알고리즘
: 이미 계산된 결과는 별도의 메모리 영역에 저장하여 다시 계산하지 않음으로서 수행 시간 단축시키는 방법
DP 구현 방법은 일반적으로 Top-down(하향식)과 Bottom-up(상향식)으로 구성된다
탑다운 (Top-Down) | 보텀업 (Bottom-Up) |
작은 크기로 문제를 나눠서 해결 | 작은 것부터 해결해서 점차 빌드업 |
메모제이션 (memoization) | 타뷸레이션 (tabulation) |
일부만 계산해도 답이 나올 때 | 모두 계산해야 답이 나올 때 |
재귀 | 반복문 |
시간 복잡도 O(n) | 시간 복잡도 O(n) |
[코드]
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int dp[] = new int[11];
dp[1]=1;
dp[2]=2;
dp[3]=4;
while(T-->0){
int N = Integer.parseInt(br.readLine());
for(int i=4; i<=N; i++){
dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
}
System.out.println(dp[N]);
}
}
}
[해설]
: BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); 테스트 케이스
int dp[] = new int[11]; dp 초기화
: dp[1]=1; n은 1일 때부터 시작
dp[2]=2; 2는 2가지 (1+1 / 2)
dp[3]=4; 3은 4가지 (1+1+1 / 1+2 / 2+1 / 3)
: while(T-->0){ 테스트 케이스만큼 반복
int N = Integer.parseInt(br.readLine()); N입력
for(int i=4; i<=N; i++){ 4부터 시작
dp[i] = dp[i-1]+dp[i-2]+dp[i-3]; 1이든 2든 3이든 만들 수 있는 만큼 합치기
}
System.out.println(dp[N]); 결과 출력
}
이제 풀어보러 갈께요 :)
* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *