본문 바로가기
Baekjoon/[3] DP

[백준] 9095번 1, 2, 3 더하기 JAVA (자바) 풀이

by Poorm 푸름 2024. 6. 29.

문제 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]);  결과 출력
    }
    

 

 

 

 

이제 풀어보러 갈께요 :)

 

https://www.acmicpc.net/problem/9095

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *