이친수를 전체 하나로 보면 규칙성을 구하는 것이 쉽지 않습니다. 하지만 이친수의 특성을 생각해보면 0으로 끝나는 것과 1로 끝나는 것으로 나눌 수 있습니다.
즉 n 자리의 이친수를 구하기 위해 아래 2가지 방법을 사용할 수 있습니다.
// 이친수
var cache = Array(repeating: -1, count: 91)
func f(_ n: Int) -> Int {
if n == 1 || n == 2 {
cache[n] = 1
}
if cache[n] < 0 {
cache[n] = f(n - 2) + f(n - 1)
}
return cache[n]
}
print(f(Int(readLine()!)!))
마찬가지로 이진수를 0으로 끝나는 수와 1로 끝나는 수로 나누어 봅니다. 이번에는 각각의 이진수의 수를 따로따로 구하는 방법입니다.
// 각각 0 혹은 1로 끝나는 n자리 이친수의 갯수
var zero = Array(repeating: -1, count: 91)
var one = Array(repeating: -1, count: 91)
func f0(_ n: Int) -> Int {
if n == 1 {
zero[n] = 0
} else if n == 2 {
zero[n] = 1
}
if zero[n] < 0 {
zero[n] = f0(n - 1) + f1(n - 1)
}
return zero[n]
}
func f1(_ n: Int) -> Int {
if n == 1 {
one[n] = 1
} else if n == 2 {
one[n] = 0
}
if one[n] < 0 {
one[n] = f0(n - 1)
}
return one[n]
}
let N = Int(readLine()!)!
print(f0(N) + f1(N))