πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ] ν”Όλ³΄λ‚˜μΉ˜ 수

EarthSea 2024. 3. 26. 10:15

 

 

πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ

μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이

✍🏻 Github

문제 풀이 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
}

뢄할정볡 ν”Όλ³΄λ‚˜μΉ˜λΌλŠ”λ°.. μ „ μˆ˜ν•™κ³Ό.. μ•ˆν•˜κ³  컴퓨터 곡학과 ν•˜κ² μŠ΅λ‹ˆλ‹€.. γ