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

이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.
동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.
입력
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
출력
첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.
풀이
dp[i][j] 배열을 만든다.
i는 0 1 2로 0은 왼쪽에 사자 1은 오른쪽 사자 2는 사자를 놓지 않은 경우이다.
j는 N번째 배열에 경우의 수이다.
dp[0][N] 은 왼쪽에 사자를 넣는 경우이므로 dp[1][N-1] 과 dp[2][N-1] 로 N-1번째의 오른쪽과 놓지 않은 경우의 수를 더해준다
dp[1][N]은 오른쪽에 사자를 넣는 경우이므로 dp[0][N-1]과 dp[2][N-1] 로 N-1번쨰의 왼쪽과 놓지 않은 경우의 수를 더해준다
dp[2][N]은 안놓는 경우이므로 N-1번째의 모든 경우의 수를 더해준다.
추가적으로 우리의 크기가 100000이므로 경우의 수는 long long 배열을 넘어서므로 매번 경우의 수를 계산할 때마다 9901로 나누어주고
입력받은 N번째의 경우의 수를 구할때도 최대 9900 + 9900 + 9900 으로 넘어서므로 9901로 또 나누어준다.
코드
fun main()
{
val N = readLine()!!.toInt()
val dp = Array(3, {IntArray(100001,{0})})
dp[0][0] = 1
dp[1][0] = 1
dp[2][0] = 1
for(i in 1..100000)
{
dp[0][i] = (dp[2][i-1] + dp[1][i-1]) % 9901
dp[1][i] = (dp[2][i-1] + dp[0][i-1]) % 9901
dp[2][i] = (dp[0][i-1] + dp[1][i-1] + dp[2][i-1]) % 9901
}
println((dp[0][N-1] + dp[1][N-1] + dp[2][N-1]) % 9901)
}
'백준 > DP' 카테고리의 다른 글
백준 [15989] kotlin (0) | 2023.01.11 |
---|---|
백준 14501 [kotlin] (0) | 2022.07.22 |
백준 1890 [kotlin] (0) | 2022.07.08 |
백준 5557 [kotlin] (0) | 2022.07.04 |
백준 12865 [kotlin] (0) | 2022.07.03 |