문제
풀이
먼저 타일들을 나열해 보자.
N = 1 / 1
N = 2 / 00, 11
N = 3 / 001, 111, 100
N = 4 / 0000, 1100, 0011, 1111, 1001
N = 5 / 00001, 11001, 00111, 11111, 10011, 00100, 11100, 10000
타일의 가짓수는 1, 2, 3, 5, 8개로 증가하며 피보나치 수열의 패턴을 보이고 있다. 따라서 dp[N] = dp[N - 1] + dp[N - 2]의 점화식을 사용하여 문제를 풀 수 있고, 문제의 조건에 따라 15746으로 나눈 나머지를 배열에 저장한다.
이 문제가 피보나치 수열이 되는 이유는 다음과 같다. 문제에서는 1 타일과 00 타일 두 가지 종류의 타일 사용할 수 있다. 따라서 N = 6인 경우를 만들 수 있는 방법은 N = 4인 경우에서 00 타일을 추가한 경우와 N = 5인 경우에서 1 타일을 추가한 경우가 N = 6이 될 것이다. 따라서 N = 6은 N = 5 더하기 N = 4으로 13개가 된다. 이것이 피보나치 수열의 성질을 나타내는 것이다.
코드
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val num = br.readLine().toInt()
val dp = IntArray(num + 1)
dp[1] = 1
if(num > 1) { // num이 1인 경우 인덱스 에러 발생하기 때문에 예외처리 해준다.
dp[2] = 2
}
for(i in 3 .. num) {
dp[i] = (dp[i - 1] + dp[i - 2])%15746
}
bw.write("${dp[num]}")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1890번: 점프 - Kotlin[코틀린] (0) | 2023.09.27 |
---|---|
[백준] 7576번: 토마토 - Kotlin[코틀린] (0) | 2023.09.27 |
[백준] 10971번: 외판원 순회 2 - Kotlin[코틀린] (0) | 2023.09.24 |
[백준] 1931번: 회의실 배정 - Kotlin[코틀린] (0) | 2023.09.23 |
[백준] 2579번: 계단 오르기 - Kotlin[코틀린] (0) | 2023.09.21 |