반응형
백준 9095번 1, 2, 3 더하기
https://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의 합으로 나타내는 방법의 수를 구해야 합니다.
- 작은 값부터 구해 나가면서, 이미 계산된 값을 활용하는 방식이 적절합니다.
- 따라서 이 문제는 다이나믹 프로그래밍(DP)을 이용하는 문제입니다.
점화식
정수 n을 만드는 경우는 세 가지 경우로 나뉩니다.
- 마지막에 1을 사용한 경우 → 남은 값은 n−1
- 마지막에 2를 사용한 경우 → 남은 값은 n−2
- 마지막에 3을 사용한 경우 → 남은 값은 n−3
따라서, 이를 일반화하면 다음과 같은 점화식이 성립합니다.
dp[n] = dp[n−1] + dp[n−2] + dp[n−3]
풀이 도출 과정
- 우선 테스트 케이스 수를 입력 받습니다. 그 다음 테스트 케이스 수만큼 for문을 실행합니다.
- for문에서 입력된 n마다 dp 배열을 이용해 dp[n] 값을 계산합니다.
- dp[i]는 dp[i-1], dp[i-2], dp[i-3]의 합으로 구합니다.
- 최종적으로 dp[n]을 출력합니다.
시간 복잡도
- dp 배열을 채우는 과정에서 O(n) 시간이 걸린다.
문제 풀이 코드
t = int(input()) # 테스트 케이스 개수 입력
for _ in range(t):
n = int(input()) # 정수 n 입력
dp = [0] * (n + 1) # DP 초기화
dp[0] = 1 # 아무것도 선택하지 않는 경우(n=0)일 때, 경우의 수 1
dp[1] = 1 # 1
if n > 1:
dp[2] = 2 # (1+1), (2)
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] # 점화식 적용
print(dp[n]) # 결과 출력
반응형
'Study > 코딩 테스트' 카테고리의 다른 글
[백준] 11659번 : 구간 합 구하기 4 해설 및 풀이 (Python) (0) | 2025.02.12 |
---|---|
[백준] 2631번 줄세우기 해설 및 풀이 (Python) (0) | 2025.02.11 |
[백준] 11047번 동전 0 해설 및 풀이 (Python) (0) | 2025.02.08 |
[프로그래머스 입문문제/3일차] 짝수는 싫어요 (Java) (0) | 2024.02.14 |
[프로그래머스 입문문제/3일차] 최빈값 구하기 (JAVA) (0) | 2024.02.14 |