2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
처음에는 팩토리얼을 써서 풀어보려고 했다. 너비가 2인 타일의 개수를 for문을 이용해 점점 증가시키며 구하고, 그에 맞는 너비가 1인 타일의 개수를 구한 후 같은 것이 있는 순열을 이용해 result에 더해주는 식으로 풀었는데 런타임 에러가 났다.
다시 찾아보니 수가 커지면 Int 범위를 벗어나기 때문에 런타임 에러가 난다고 한다. 애초에 팩토리얼을 써서 풀면 시간 초과가 나는데 런타임 에러가 나 준 덕분에 삽질을 초기에 멈출 수 있었다 (...)
질문 게시판에서 추천받은 대로 메모이제이션을 활용해서 풀었다. 메모이제이션을 활용해서 풀 때 주의할 점은 밑 코드를 보면 알겠지만 for문을 돌릴 때 i가 3부터 시작하기 때문에 n이 1이나 2일 때 예외를 처리해줘야 한다.
이거 안해서 한 번 더 틀렸다
ㅇㄴ
import Foundation
var n = Int(readLine()!)!
var memo = [Int](repeating: -1, count: 1001)
if n == 1 { print(1) }
else if n == 2 { print(2) }
else {
memo[1] = 1
memo[2] = 2
for i in 3...n { memo[i] = ((memo[i - 2] % 10007) + (memo[i - 1] % 10007)) % 10007 }
print(memo[n])
}
ㅠㅠ 한번 안쓰기 시작하니 너무너무 귀찮아지는군
으아악 써야한다! 써야한다!