자료구조 & 알고리즘/BOJ 문제풀이
[백준 11726] 2xn 타일링 (Kotlin 풀이)
쉽코기
2022. 1. 19. 22:29
1.문제
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
2. 입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
3. 출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
4. 포인트
-
- 점화식을 세울 수 있어야한다
- dp[ n+2 ] = (dp[ n+1 ] + dp[ n ]) / 10007
- 10007 로 나눔 다는 의미를 파악한다.
- 점화식을 세울 수 있어야한다
4. 문제 풀이
그림을 그려가며 규칙 찾아 점화식을 세울 수 있엇다. 어떤 원리인지는 파악하지 못했지만 규칙을 찾아 낼 수 있었다.
문제는 10007 로 나눈다는 의미를 파악하지 못해 조금 헤매었다.
문제에서 10007 로 나눈 값을 요했다는 것은 너무 큰 값으로 인해 오류가 날 수 있는 가능성이 있는 것을 의미한다,
처음에는 마지막 값만 나누어 주었지만 중간 값이 int 범위를 벗어나 오류가 난 것 같다.
점화식을 보면 dp 에 값을 저장 할때에도 나눗셈을 적용해주어도 결과에 영향을 주지 않는 다는 것을 알 수 있다.
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val n = readLine().toInt()
if (n <= 3) {
println(n)
} else {
val dp = IntArray(n + 1)
for (i in 0..2) {
dp[i] = i
}
if (n >= 3) {
for (i in 3..n) {
dp[i] = (dp[i - 1] + dp[i - 2])%10007
}
}
println(dp[n] )
}
}