티스토리 뷰

반응형

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

 

알고리즘 분류: 다이나믹 프로그래밍

 

링크: www.acmicpc.net/problem/9095

 

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net

문제

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

 

 

문제 파악

 

그동안 내가 다이나믹 프로그래밍 알고리즘에 많이 약해서 요즘 연습을 하기 시작했다.

 

간단한 문제부터 시작하는 중인데 이 문제는 전형적인 다이나믹 프로그래밍 연습을 하기 좋은 문제인 것 같다.

 

정수 n을 1, 2, 3의 합으로 나타내는 방법을 구하는 문제이다.

 

합을 나타낼 때 수를 1개 이상 사용하라는 것을 보니 1은 그냥 1의 합으로 나타낼 수 있다고 보는 것 같다.

 

문제의 규칙을 찾아보자면 4를 구하는 방법은 7가지가 있다고 나와있다.

 

1 = (1)    # 1개

2 = (1, 1) (2)    # 2개

3 = (1, 1, 1) (1, 2) (2, 1) (3)    # 4개

4 = (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (2, 1, 1) (2, 2) (1, 3) (3, 1)    # 7개 (1 + 2 + 4)

 

n이 4이상일 때 n을 구하는 방법은 (n - 3), (n - 2), (n - 1)을 구하는 방법을 각각 더한것이다

 

 

코드

# 9095번

T = int(input())

for _ in range(T):
    n = int(input())
    count_list = [1, 2, 4]

    for i in range(4, n + 1):
        i = count_list[-1] + count_list[-2] + count_list[-3]
        count_list.append(i)

    if n == 1:
        answer = 1
    elif n == 2:
        answer = 2
    elif n == 3:
        answer = 4
    else:
        answer = count_list[-1]

    print(answer)

앞서 설명했듯이 n이 4이상일 경우에는

 

(n - 3), (n - 2), (n - 1)을 구하는 경우를 다 더해주면 된다.

 

이를 count_list의 뒤에서부터 1, 2, 3번째 인덱스를 더해주는식으로 만들었다.

 

이를 다 더해준 수를 count_list의 맨 뒤에 계속 추가하면서 반복문을 돌게 한다.

 

n이 4이하인 경우에는 특수한 경우이기 때문에

 

1 일때는 1, 2 일때는 2, 3일때는 4를 넣어준다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함