๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ–ฅ CS/Algorithm

[Algorithm/Swift] ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)

์•ˆ๋…•ํ•˜์„ธ์š” ์ œ์ธ์ž…๋‹ˆ๋‹ค!

์˜ค๋Š˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋… ์ค‘ ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•ด๋ณด๊ณ , ๋™์  ๊ณ„ํš๋ฒ•์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ œ์ธ <ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด> ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ์ ์šฉ๊นŒ์ง€ ํ•ด๋ณด๋„๋ก ํ• ๊ฒŒ์š”!

๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming, DP)

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(์ค„์—ฌ์„œ DP)๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ๋™์  ๊ณ„ํš๋ฒ•์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„๊ณ , ๊ฐ™์€ ๋ฌธ์ œ๋ผ๋ฉด ํ•œ ๋ฒˆ์”ฉ๋งŒ ํ’€์–ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์—์„œ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization) ๊ธฐ๋ฒ•์ด ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”!

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์ด๋ž€, ํ•œ ๋ฒˆ ๊ตฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅํ•ด๋‘๊ณ  ๊ฐ™์€ ์‹์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด ์ €์žฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์บ์‹ฑ(Caching)์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผํ•  ๋•Œ, ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์•ฝ๊ฐ„ ๋” ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ œ์ธ <ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด>์„ ํ†ตํ•ด์„œ ๋” ์ž์„ธํžˆ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค!

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๋กœ ๋™์  ๊ณ„ํš๋ฒ•์„ ์ดํ•ดํ•ด๋ณด์ž

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด๋ž€, ์–ด๋–ค ์ˆ˜์—ด์˜ ํ•ญ์ด ์•ž์˜ ๋‘ ํ•ญ์˜ ํ•ฉ๊ณผ ๊ฐ™์€ ์ˆ˜์—ด์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™œ์šฉํ•œ ๋ฌธ์ œ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ฉฐ ๋™์  ๊ณ„ํš๋ฒ•์„ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ• ๊ฒŒ์š”! 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 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, ... ์™€ ๊ฐ™์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๋ฌธ์ œํ’€์ด

1. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Level2 ๋‚œ์ด๋„์ธ ์ด ๋ฌธ์ œ๋Š” n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ, ์ด ์ˆ˜๋ฅผ 1234567์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋ผ๋Š” ์กฐ๊ฑด๋งŒ ์ถ”๊ฐ€๋œ ๋ฌธ์ œ์ธ๋ฐ์š”! ๋จผ์ €, ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณธ๋‹ค๋ฉด

 

func solution(_ n: Int) -> Int {
    if n <= 1 {
        return n
    } else {
        return (solution(n-1) + solution(n-2)) % 1234567
    }
}

 

์œ„์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ.. ๋ฌธ์ œ๋Š”..ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ์ข‹์ง€ ๋ชปํ•œ ์ฝ”๋“œ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค!(์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ์™€๋ฅด๋ฅด๐Ÿฅฒ)

 

์ด๋ ‡๊ฒŒ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜๋Š” ํ’€์ด๊ฐ€ ์™œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ํ’€์ด์ผ๊นŒ์š”??๐Ÿค”

๋งŒ์•ฝ 4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ 1234567์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด solution(4)๋ฅผ ์‹คํ–‰ํ•˜๋ฉด,

์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋™์ผํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ–ˆ์ง€๋งŒ, ๊ณ„์† ํ˜ธ์ถœ๋  ๋•Œ ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฐ’์ด ๊ณ„์‚ฐ๋˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์—์„œ soultion(1)์€ ์ด 3๋ฒˆ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. solution(n)์—์„œ n๊ฐ’์ด ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ์ค‘๋ณต ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์™€ ์ค‘๋ณต ํšŸ์ˆ˜ ๋˜ํ•œ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” n๊ฐ’์ด ์ปค์ง์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๊ฐ€ ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

2. ๋™์  ๊ณ„ํš๋ฒ•์„ ์ด์šฉํ•œ ๊ตฌํ˜„

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ์ ํ™”์‹์„ ์œ„์™€ ๊ฐ™์ด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๋‹จ์ˆœํžˆ ๋งค๋ฒˆ ๊ณ„์‚ฐํ•˜๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๋™์  ๊ณ„ํš๋ฒ•์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค!

 

func solution(_ n: Int) -> Int {
    var cache = [0, 1]
    
    for i in 2...n {
        cache.append((cache[i-1] + cache[i-2]) % 1234567)
    }
    
    return cache[n]
}

 

์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด cache๋ผ๋Š” Array ์ €์žฅ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•ด (์ด์ „ ๋‘ ์ˆ˜์˜ ํ•ฉ % 1234567)์ธ ๊ฐ’์„ ์ €์žฅํ•ด๋‘๊ณ ,

์ค‘๋ณต ๊ณ„์‚ฐ ์—†์ด n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ 1234567์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ƒฅ n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด for ๋ฃจํ”„์—์„œ % 1234567 ๋ถ€๋ถ„๋งŒ ์‚ญ์ œํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ฃ ?)

 

๋งŒ์•ฝ solution(4)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, (0, 1์€ ์‹คํ–‰ ์‹œ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ cache์— ์ €์žฅ๋˜๋‹ˆ) 2, 3๋ฒˆ์งธ ๊ฐ’๊นŒ์ง€๋ฅผ ๋จผ์ € ๊ตฌํ•˜์—ฌ ์ €์žฅํ•˜๊ณ , ์ด ๊ฐ’๋“ค์ด ๋ชจ๋‘ ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๊ฐ€์ ธ์™€ cache[2] + cache[3] ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ตœ์ข… ๊ฐ’์„ ๋„์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•ž์—์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜์˜ ์ค‘๋ณต ์‹คํ–‰์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

๋™์  ๊ณ„ํš๋ฒ•์˜ ์‚ฌ์šฉ ์กฐ๊ฑด

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์žฌ๊ท€ํ•จ์ˆ˜ ํ’€์ด์™€ ๋น„๊ตํ•ด๋ณด๋‹ˆ ์ด์ œ ๋™์  ๊ณ„ํš๋ฒ•์ด ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์ธ์ง€ ๊ฐ์ด ์˜ค์‹œ์ฃ ??

ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋™์  ๊ณ„ํš๋ฒ•์„ ์ ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค! ๋™์  ๊ณ„ํš๋ฒ•์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹

์œ„์˜ <ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜> ๋ฌธ์ œ์—์„œ ์ ์šฉํ•œ ๋™์  ๊ณ„ํš๋ฒ•์˜ ํ’€์ด ๋ฐฉ๋ฒ•์€ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ๋‹ต์„ ๋„์ถœํ•ด ์ด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•œ ๋ฐฉ์‹์€ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ต์„ ๋„์ถœํ•œ๋‹ค๊ณ  ํ•˜์—ฌ ๋ณดํ…€์—…(Bottom-Up) ๋ฐฉ์‹์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

 

๋™์  ๊ณ„ํš๋ฒ•์—๋Š” ๋ณดํ…€์—… ๋ฐฉ์‹๊ณผ ๋”๋ถˆ์–ด ํƒ‘๋‹ค์šด(Top-Down) ๋ฐฉ์‹๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํƒ‘๋‹ค์šด ๋ฐฉ์‹์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ์š”, ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ํ•˜์—ฌ ํƒ‘๋‹ค์šด ๋ฐฉ์‹์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹์˜ ์ค‘๋ณต ์‹คํ–‰์ด๋ผ๋Š” ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•ด ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ–ˆ๋Š”๋ฐ ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฐ๊ฐ€...ํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”! ํƒ‘๋‹ค์šด ๋ฐฉ์‹์˜ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์‚ดํŽด๋ด…์‹œ๋‹ค!

 

var cache = Array(repeating: 0, count: 100001)

func solution(_ n: Int) -> Int {
    
    // ์ข…๋ฃŒ ์กฐ๊ฑด(1 or 2์ผ ๋•Œ 1์„ ๋ฐ˜ํ™˜)
    if n == 1 || n == 2 {
        return 1
    }
    
    // ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    if cache[n] != 0 {
        return cache[n]
    } else { // ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ์ผ ๋•Œ ์ ํ™”์‹์— ๋”ฐ๋ผ ๊ณ„์‚ฐ
        cache[n] = (solution(n-1) + solution(n-2)) % 1234567
    }
    
    return cache[n]
}

 

์•ž์—์„œ ๋ณธ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ’€์ด์™€ ๋‹ค๋ฅธ ์ ์€ ์ œํ•œ ์‚ฌํ•ญ์— ์ œ์‹œ๋œ ์ตœ๋Œ“๊ฐ’๋ณด๋‹ค 1๋งŒํผ ํฐ ํฌ๊ธฐ์˜ cache๋ผ๋Š” ๋ฐฐ์—ด์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋‘๊ณ  ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ฐจ๋ก€๋กœ cache์—๋‹ค ์ €์žฅํ•ด์„œ ๋‚˜์ค‘์— ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๋•Œ, ์ด๋ฏธ ์ €์žฅํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์ค‘๋ณต ํ˜ธ์ถœ์ด ์—†๋„๋ก ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค! (์‹ค์ œ๋กœ ์ด ์ฝ”๋“œ ๋˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ์‹œ๊ฐ„ ์ œํ•œ์— ๊ฑธ๋ฆฌ์ง€ ์•Š๊ณ  ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค)

 

์ด๋ ‡๊ฒŒ ํƒ‘๋‹ค์šด ๋ฐฉ์‹๊นŒ์ง€ ๋™์  ๊ณ„ํš๋ฒ•์˜ ๋ฐฉ์‹ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์‚ดํŽด๋ณด์•˜๋Š”๋ฐ์š”, ๋™์  ๊ณ„ํš๋ฒ•์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๋ณดํ…€์—… ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ๊ฐ’์ด ๋„ˆ๋ฌด ์ปค์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์•„์ฃผ ๋งŽ์ด ํ•ด์•ผํ•  ๊ฒฝ์šฐ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋ฏธ๋ฆฌ cache ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ณดํ…€์—… ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

 

๋™์  ๊ณ„ํš๋ฒ•์€ ์‚ฌ์‹ค ๊ฐœ๋…์€ ํฌ๊ฒŒ ์–ด๋ ต์ง„ ์•Š์ง€๋งŒ ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค..(๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๊ฒ ๊ตฌ๋‚˜๋ฅผ ๊นจ๋‹ซ๊ณ  ์ ํ™”์‹์„ ์„ธ์šฐ๋Š” ๊ณผ์ •์ด ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์•„์š”..) ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ํŠน์ •ํ•œ ๋ฌธ์ œ๋ฅผ ์™„์ „ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์‹œ๊ฐ„์ด ๋งค์šฐ ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๋ฉด ๋™์  ๊ณ„ํš๋ฒ•์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

 


[์ฐธ๊ณ  ์ž๋ฃŒ]

 

์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ ๊ตฌ์กฐ - ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ DP

์ค‘๋ณต๋˜๋Š” ์—ฐ์‚ฐ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜?1\. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ (์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ)2\. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•  ๋•Œ(์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ

velog.io

 

Swift) ๋™์  ๊ณ„ํš๋ฒ• (Dynamic Programming) ์ดํ•ดํ•˜๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”:) ์†Œ๋“ค์ž…๋‹ˆ๋‹ค ์˜ค๋žœ๋งŒ์— ํฌ์ŠคํŒ…์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”..! ์•„๋งˆ 1์›” ๋‹ฌ์—” ์ž๋ฃŒ๊ตฌ์กฐ + ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์ด ์ฃผ์ผ ๊ฒƒ ๊ฐ™๊ณ .. 2์›”๋‹ฌ๋ถ€ํ„ด ๋‹ค์‹œ iOS + Swift์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์„ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค :) ์˜ค

babbab2.tistory.com

<์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ>

 

์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ | ๋‚˜๋™๋นˆ - ๊ต๋ณด๋ฌธ๊ณ 

์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ | IT ์ทจ์ค€์ƒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ž…์‚ฌํ•˜๊ณ  ์‹ถ์€ ์นด์นด์˜คใ†์‚ผ์„ฑ์ „์žใ†๋„ค์ด๋ฒ„ใ†๋ผ์ธ! ์ทจ์—…์˜ ์„ฑ๊ณต ์—ด์‡ ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ์— ์žˆ๋‹ค!IT ์ทจ์ค€์ƒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜

product.kyobobook.co.kr