백준 9095 1,2,3, 더하기

2019. 5. 6. 16:19알고리즘/동적 프로그래밍

문제

정수 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의 합으로 나타내는 방법의 수를 출력한다.

 

예제 입력

...더보기

3

4

7

10

예제 출력

...더보기

7

44

274

 

접근 방법

예시에서 정수가 4일 때와 7일 때의 방법의 수(경우의 수)를 알 수 있다.

그래서 주어진 정수가 5와 6일 때를 한 번 구하면

정수가 4, 5, 6일 때의 경우의 수를 더하니 정수가 7일 때의 경우의 수와 같았다.

 

그렇다면

어떤 정수 n이 있으면 n-1, n-2, n-3 을 만들 수 있는 경우의 수를 더하면 될 것인가.

그래서 정수 1, 2, 3, 4, 5 까지 경우의 수를 수작업으로 구해 보았다.

1 - 1 (1개)

2 - 1+1, 2 (2개)

3 - 1+1+1, 2+1, 1+2, 3 (4개)

그러면 4는 1(4-3)에서 3을 더한 것, 2(4-2)에서 2를 더한 것, 3(4-1)에서 1을 더한 것이다.

그러니 4는 정수 1, 2, 3의 경우의 수를 더한 것과 같다.(1+2+4 = 7)

 

즉, 1, 2, 3 으로 정수 n을 만드는 경우의 수 A(n)는 A(n) = A(n-1) + A(n-2) + A(n-3) 이다.

 

코드

public class Main {
  public static void main(String[] args) {
    int[] arr = new int[11];
    int T, n;
    Scanner scanner = new Scanner(System.in);
     
    arr[0] = 0; // 정수가 0일 때 방법(경우)의 수
    arr[1] = 1; // 정수가 1일 때 경우의 수, 1 => 1개
    arr[2] = 2; // 정수가 2일 때 경우의 수, 1+1, 2 => 2개
    arr[3] = 4; // 정수가 3일 때 경우의 수, 1+1+1, 1+2, 2+1, 3 => 4개
    T = scanner.nextInt();
    for(int i = 0; i < T; i++) {
      n = scanner.nextInt();
      for(int j = 4; j <= n; j++){
        arr[j] = arr[j-1] + arr[j-2] + arr[j-3];
      }
      System.out.println(arr[n]);
    }
    scanner.close();
  }
}

'알고리즘 > 동적 프로그래밍' 카테고리의 다른 글

백준 1890 점프  (0) 2019.05.06
백준 2293 동전1  (0) 2019.05.06