문제
어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다.

이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.
동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.
입력
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
출력
첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.
내가 푼 풀이
- 사자를 배치할때, 가로 세로로 붙어있게 배치할 수 없다.
- 사자를 한마리도 배치하지 않는 경우도 포함한다.
- 결국 N칸이 늘어나도 생기는 경우의수는 두 가지다. N번째에 사자를 채우는 경우와 채우지 않는 경우
- N = 1 일 때, 사자를 채우는 방법은 사자가 0마리일때 1 , 사자가 1마리일때 2 총 3가지이다.
- N = 2 일때, 2번째에 사자를 채우는 경우 바로 이전의 사자의 위치에 따라 다르지만 칸이 2개 더 생기므로 3 * 2 = 6이다.
- 반대로 사자를 채우지 않는 경우는 위에 사자를 채울 때, 이전의 위치까지 고려하여 경우의수를 정했으므로 아예 채우지 않는경우는
- n-2 위치까지의 경우의 수가 된다.
- 이를 점화식으로 나타내면 다음과 같다. "dp[n] = 2 * n 칸에 사자를 채우는 경우의 수"
- dp[n] = 2 * dp[n-1] + dp[n-2]
import Foundation
let count = Int(readLine()!)!
var dp = Array(repeating: 0, count: 100001)
dp[0] = 1
// dp 입력
for i in 1...count {
if i == 1 {
dp[1] = 3
continue
}
dp[i] = (2 * dp[i-1] + dp[i-2]) % 9901
}
print(dp[count])
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-4963 섬의 개수 Swift (0) | 2023.06.05 |
---|---|
BOJ-1092 배 Swift (0) | 2023.06.05 |
BOJ-7569 토마토 Swift (0) | 2023.06.05 |
BOJ-18310 안테나 Swift (0) | 2023.06.04 |
BOJ-2565 전깃줄 Swift (0) | 2023.06.04 |