[Silver III] 1, 2, 3 더하기 - 9095
성능 요약
메모리: 69100 KB, 시간: 12 ms
분류
다이나믹 프로그래밍
문제 설명
정수 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 | 4 | 5 | 6 |
경우 | 1 | 1 + 1 2 |
1 + 1 + 1 1 + 2 2 + 1 3 |
1 + 1 + 1+ 1
1 + 1 + 2
1 + 2 + 1
2 + 1 + 1
2 + 2
1 + 3
3 + 1
|
1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 2 + 1
1 + 2 + 1 + 1
2 + 1 + 1 + 1
1 + 2 + 2
2 + 2 + 1
2 + 1 + 2
1 + 1 + 3
1 + 3 + 1
3 + 1 + 1
2 + 3
3 + 2
|
...
|
합 | 1 | 2 | 4 | 7 | 13 | 24 |
4 이상부터는 n이 i라고 가정했을 때, (i -3) + (i - 2) + (i - 1)을 하면 찾을 수 있습니다,,
뭐 이런 문제는,,, 많이 풀어보는 수 밖에 없는 것 같습니다,,
다음은 코드입니다.
let n = Int(readLine()!)!
var dp = Array(repeating: 0, count: 12) // 0번째 인덱스 내버려두기 위해
(dp[1], dp[2], dp[3]) = (1, 2, 4)
for i in 4...11 { // 점화식 구해놓기
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]
}
for _ in 0..<n {
let input = Int(readLine()!)!
print(dp[input])
}
728x90
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 2805 나무 자르기 - 스위프트(Swift) (0) | 2023.09.26 |
---|---|
[백준(BOJ)] 5525 IOIOI - 스위프트(Swift) (0) | 2023.09.11 |
[백준(BOJ)] 2579 계단 오르기 - 스위프트(Swift) (0) | 2023.09.11 |
[백준(BOJ)] 11659 구간 합 구하기 4 - 스위프트(Swift) (0) | 2023.09.08 |
[백준 (BOJ)] 1629 곱셈 - 스위프트(Swift) (0) | 2023.09.08 |