[C++ / 9095] 1, 2, 3 더하기

2023. 8. 8. 13:13·알고리즘/백준
728x90

문제

 

9095번: 1, 2, 3 더하기

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

www.acmicpc.net


문제 설명

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

단, 2가 주어진다면 방법의 수에 2도 포함이 된다. 그리고 4를 구현함에 있어서 1+1+2, 2+1+1 같은 경우는 다른 경우로 판단한다.


예를 들어,
정수 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

풀이 방식

이 문제는 해당 문제와 비슷한 유형의 Dynamic Programming 문제이다.

이전 결과가 현재의 값을 구하는데 영향을 미친다는 것이다.

 

이 문제를 풀기 위해서 1부터 경우의 수를 하나씩 구해보자

1의 경우 (1개)
- 1

2의 경우 (2개)
- 1+1
- 2

3의 경우 (4개)
- 1+1+1
- 1+2
- 2+1
- 3

4의 경우 (7개)
- 1+1+1+1
- 2+1+1
- 1+2+1
- 1+1+2
- 2+2
- 3+1
- 1+3

5의 경우 (13개)
- 1+1+1+1+1
- 2+1+1+1
- 1+2+1+1
- 1+1+2+1
- 1+1+1+2
- 2+2+1
- 2+1+2
- 1+2+2
- 3+1+1
- 1+3+1
- 1+1+3
- 3+2
- 2+3

...

위에서 총 n이 주어졌을때, 만들수 있는 총 개수를 보면 1, 2, 4, 7, 13 ... 이런 식으로 증가하고 있는데 7은 1+2+4이고 13은 7+4+2 이다.

이를 검증해 보기 위해서는 계속 구해보면 될 것이다.

 

즉, n이 1, 2, 3인 경우에는 해당되지 않지만 4 부터는 어떠한 규칙을 띄고 있다.

이에 대한 점화식을 구해보면

dp(n) = dp(n-1) + dp(n-2)+ dp(n-3)

다음과 같이 나타낼 수 있다.

 

다음 식을 이용한 재귀 함수를 구현해 문제를 풀면 된다.


솔루션

#include <iostream>
#include <vector>

using namespace std;

int dp(int v)
{
  if (v == 1)
    return 1;
  else if (v == 2)
    return 2;
  else if (v == 3)
    return 4;
  else
    return dp(v - 1) + dp(v - 2) + dp(v - 3);
}

int main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int n;

  cin >> n;
  vector<int> v(n);

  for (int i = 0; i < n; i++)
  {
    cin >> v[i];
    cout << dp(v[i]) << endl;
  }
}

여담

최근 DP와 관련된 문제를 풀어보면서 많이 익숙해진것 같다.

예전에는 알고리즘 잘 푸는 사람들이 신기했는데 하다 보니까 점화식 까지는 모르겠지만 음~ 이건 DP로 풀면 되겠구나 이런 감이 조금 생겼다.

 

차후 카카오 코딩테스트 같은 것을 풀수 있을 정도로 성장하면 좋겠다..ㅎㅎ

 

 

저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[C++ / 2751] 수 정렬하기 2  (0) 2023.08.13
[C++ / 1260] DFS와 BFS  (0) 2023.08.09
[C++ / 2293] 동전 1  (0) 2023.08.03
[C++ / 11053] 가장 긴 증가하는 부분 수열  (0) 2023.07.30
[C++ / 2012] 등수 매기기  (0) 2023.07.29
'알고리즘/백준' 카테고리의 다른 글
  • [C++ / 2751] 수 정렬하기 2
  • [C++ / 1260] DFS와 BFS
  • [C++ / 2293] 동전 1
  • [C++ / 11053] 가장 긴 증가하는 부분 수열
기짜낭
기짜낭
생각이 많지만, 지금 내가 해야할 것을 하자.
  • 기짜낭
    So tired
    기짜낭
    • 분류 전체보기 (199)
      • 개발 (11)
        • Javascript (19)
        • Typescript (5)
        • Canvas (8)
        • React (13)
        • C (3)
      • 활동 (63)
        • 개인 프로젝트 (33)
        • 나눔 서포터즈 3기 (9)
        • 멋쟁이 사자처럼 (7)
        • 0&1 C++ 자료구조 스터디 (0)
        • 제 9회 창업 아이디어톤 (3)
        • Poom (ZeroWasteShop) (3)
        • 해커톤 (2)
        • 우테코 프리코스 7기 (6)
      • 알고리즘 (27)
        • 알고리즘 정리 (5)
        • 백준 (18)
        • 프로그래머스 (4)
      • 강연 (7)
      • 독서 (18)
      • 회고 & 생각 (16)
        • 연간회고 (4)
      • 기타 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • ※ 예전 블로그
  • 인기 글

  • 태그

    개념
    TypeScript
    HTML5
    HTML
    대학
    독서
    canvas
    1주 1권
    Javascript
    개발자
    독후감
    백준
    타입스크립트
    tutorial
    프로그래밍
    Erica
    에리카
    우테코
    ES6
    디자인
    군대
    개발
    CSS
    한양대학교
    react
    3기
    프론트엔드
    프로젝트
    1주에 1권씩
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
기짜낭
[C++ / 9095] 1, 2, 3 더하기
상단으로

티스토리툴바