티스토리 뷰
백준 9095번 1, 2, 3 더하기
알고리즘 분류: 다이나믹 프로그래밍
링크: www.acmicpc.net/problem/9095
문제
정수 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를 넣어준다.
'Python 알고리즘' 카테고리의 다른 글
백준 2947번 파이썬 풀이: 나무 조각 (0) | 2020.09.13 |
---|---|
백준 1003번 파이썬 풀이: 피보나치 함수 (0) | 2020.09.11 |
백준 1049번 파이썬 풀이: 기타줄 (0) | 2020.09.10 |
백준 1026번 파이썬 풀이: 보물 (0) | 2020.09.10 |
백준 11728번 파이썬 풀이: 배열 합치기 (0) | 2020.09.09 |