π μ½λ©ν μ€νΈ
βπ» Github
λ¬Έμ μ€λͺ
νΌλ³΄λμΉ μλ F(0) = 0, F(1) = 1μΌ λ, 1 μ΄μμ nμ λνμ¬ F(n) = F(n-1) + F(n-2) κ° μ μ©λλ μ μ λλ€.
μλ₯Όλ€μ΄
- F(2) = F(0) + F(1) = 0 + 1 = 1
- F(3) = F(1) + F(2) = 1 + 1 = 2
- F(4) = F(2) + F(3) = 1 + 2 = 3
- F(5) = F(3) + F(4) = 2 + 3 = 5
μ κ°μ΄ μ΄μ΄μ§λλ€.
2 μ΄μμ nμ΄ μ λ ₯λμμ λ, nλ²μ§Έ νΌλ³΄λμΉ μλ₯Ό 1234567μΌλ‘ λλ λλ¨Έμ§λ₯Ό 리ν΄νλ ν¨μ, solutionμ μμ±ν΄ μ£ΌμΈμ.
μ ν μ¬ν
- nμ 2 μ΄μ 100,000 μ΄νμΈ μμ°μμ λλ€.
μ μΆλ ₯ μ
n | return |
3 | 2 |
5 | 5 |
μ μΆλ ₯ μ μ€λͺ
νΌλ³΄λμΉμλ 0λ²μ§ΈλΆν° 0, 1, 1, 2, 3, 5, ... μ κ°μ΄ μ΄μ΄μ§λλ€.
λ¬Έμ νμ΄
λμ νμ΄
첫λ²μ§Έ μ€μ²©ν¨μ νμ΄ → μ€ν¨!
func solution(_ n:Int) -> Int {
func f(_ n: Int) -> Int {
if n == 0 {
return 0
}else if n == 1 {
return 1
}else {
return f(n-1) + f(n-2)
}
}
return f(n) % 1234567
}
n κ°μ μ΅λκ°μ΄ 100,000μ΄κΈ° λλ¬Έμ λ무 λ§μ μ€μ²©ν¨μλ μκ°μλ¬κ° λλ κ²
λμ 첫λ²μ§Έ νμ΄λ f(100,000) → f(99,999) + f(99,998) … κ²°κ΅ 2μ 100,000λ²μ μ°μ°νλ μ
μ°μ° νμκ° 1μ΅λ²μ λμ΄κ°λ©΄ μκ° μ΄κ³Όκ° λ° κ°λ₯μ±μ΄ μ‘΄μ¬νλ―λ‘ nμ κ°μ΄ 50μΌ λμ μ°μ° νμλ 2μ 50μΉμΈ 1,125,899,906,842,624 λ²μ΄λ€. nκ°μ΄ 50μ λμ΄μ λΆν° μ΄λ―Έ μκ°μ΄κ³Όκ° λ° κ°λ₯μ±μ΄ μλ κ²μ΄λ€.
κ·Έλμ forλ¬ΈμΌλ‘ λλ¦¬κΈ°λ‘ νλ€.
λλ²μ§Έ forλ¬Έ νμ΄ → μ€ν¨!
func solution(_ n:Int) -> Int {
var x = 0
var y = 1
for i in 1...n/2 {
x = x + y
y = y + x
}
return n % 2 == 0 ? x % 1234567 : y % 1234567
}
μ°μ°νμκ° O(n/2)λ‘ μ€μ΄λ λ€. μκ°μ΄κ³Όλ₯Ό ν΄κ²°μ νλ€ νμ§λ§ μ€ν¨ (signal: illegal instruction (core dumped)) κ° λ¬λ€.
μ΄λ Int λ²μλ₯Ό λ²μ΄λ μ°μ° μ€λ₯μΈ κ² κ°μλ€.
F(10,000)μ κ°μ 2.6863810024486E+208
F(100)μ κ°μ 2.1892299583456E+20
F(50)μ κ°μ 7,778,742,049
F(48)μ κ°μ 2,971,215,073
nμ΄ 48μΌ λ, Intμ μ΅λκ°μΈ 2,147,483,647μ λλλ€.
Int νμ μΌλ‘λ μ΄λ―Έ nμ΄ 48μ΄ λμμ λλΆν° κ°μ μ΄κ³Όκ° νμ¬ κ³μ°μ ν μ μλ€.
λ¬Έμ μμ 1234567λ‘ λλ λλ¨Έμ§λ₯Ό ꡬνλΌλ λ°λ μ΄μ κ° μμ κ²μ΄λ€.
λλ¨Έμ§ μ°μ°μ λ―μ΄λ³΄μ.
μ΄μνκ² μκΈ΄ λκ·ΈλΌλ―Έμ μλκΈ°λ₯Ό κ·Έμ ν¨μλ nμ λλ¨Έμ§λ₯Ό λνλΈλ€.
λͺ¨λλ¬ μ°μ μ λ§μ 곡μμμ
a+b κ° λͺ¨λλ¬ nμμ cμ λμΉ κ΄κ³λ₯Ό λνλΌ λ, aλ₯Ό nμΌλ‘ λλ λλ¨Έμ§ + bλ₯Ό nμΌλ‘ λλ λλ¨Έμ§λ cλ₯Ό nμΌλ‘ λλ λλ¨Έμ§μ κ°λ€λ κ²μ΄λ€. μ 곡λ λ°°μ΄κ±°λΌ κ°λ¬Όκ°λ¬Ό..
κ·Έλμ μ°Ύμλ΄€λλ λ μ½κ² μ€λͺ ν λλ¨Έμ§ μ°μ°μ μ±μ§μ΄ μμλ€.
μμ μ±μ§μ λ°νμΌλ‘ λ€μ λ¬Έμ λ₯Ό νμ΄λ³΄μ.
μΈ λ²μ§Έ forλ¬Έκ³Ό λλ¨Έμ§ μ±μ§μ μ΄μ©ν νμ΄ → μ λ΅!
func solution(_ n:Int) -> Int {
var x = 0
var y = 1
for i in 1...n/2 {
x = ( x + y ) % 1234567
y = ( y + x ) % 1234567
}
return n % 2 == 0 ? x % 1234567 : y % 1234567
}
xμ yκ° κ³μ° λ λλ§λ€ λλ¨Έμ§ μ°μ°μ ν΄μ£Όμ΄ Intκ°μ λμ§ μλλ‘ μ°μ°μ ν΄μ€λ€.
μ¬μ€ μ¬μ΄ λ¬Έμ μΈμ€ μμλλ 30λΆμ΄λ κ±Έλ Έλ€..
λ€λ₯Έ μ¬λ νμ΄
struct matrix2x2 {
var _00, _01, _10, _11: Int
init(_00: Int, _01: Int, _10: Int, _11: Int) {
self._00 = _00 % 1234567
self._01 = _01 % 1234567
self._10 = _10 % 1234567
self._11 = _11 % 1234567
}
init(m: matrix2x2) {
self._00 = m._00 % 1234567
self._01 = m._01 % 1234567
self._10 = m._10 % 1234567
self._11 = m._11 % 1234567
}
}
func *(left: matrix2x2, right: matrix2x2) -> matrix2x2 {
return matrix2x2(_00: left._00 * right._00 + left._10 * right._01,
_01: left._00 * right._10 + left._10 * right._11,
_10: left._10 * right._00 + left._11 * right._01,
_11: left._10 * right._10 + left._11 * right._11)
}
func solution(_ n:Int) -> Int {
var m = matrix2x2(_00: 1, _01: 0, _10: 0, _11: 1)
var fibo = matrix2x2(_00: 1, _01: 1, _10: 1, _11: 0)
var val = n
while val > 0 {
if val % 2 == 1 {
m = m * fibo
}
fibo = fibo * fibo
val /= 2
}
return m._01
}
λΆν μ 볡 νΌλ³΄λμΉλΌλλ°.. μ μνκ³Ό.. μνκ³ μ»΄ν¨ν° 곡νκ³Ό νκ² μ΅λλ€.. γ