๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
5๏ธโƒฃ CS/Algorithm

[Swift Algorithm Note] ๋™์  ๊ณ„ํš๋ฒ• (feat. Fibonacci)

by seolhee2750 2021. 8. 28.

๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€,, ๋„์ €ํžˆ ์•ˆํ’€๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ๋งž๋‹ฅ๋œจ๋ฆฌ๊ณ ..

์•Œ๊ณ ๋ณด๋‹ˆ LIS๋ผ๋Š” ํ’€์ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. 

๊ทผ๋ฐ LIS๋Š” DP(๋™์  ๊ณ„ํš๋ฒ•)์„ ์‚ฌ์šฉํ•ด์•ผ ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•˜๋”๋ผ..

๋”ฐ๋ผ์„œ ์˜ค๋Š˜์€ ๋™์  ๊ณ„ํš๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณธ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

๐Ÿ“Ž ๋™์  ๊ณ„ํš๋ฒ• (Dynamic Programming)

๋™์  ๊ณ„ํš๋ฒ•์€ ์ด๋ฆ„๊ณผ๋Š” ์ข€ ๋งค์นญ์ด ์•ˆ๋˜๋Š”๋“ฏ.?..ํ•œ๋ฐ

ํ•œ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ’€๊ณ ,

๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ์ƒ์œ„ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚ด๋Š” ์ƒํ–ฅ์‹ ์ ‘๊ทผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

์œ„์˜ ์„ค๋ช…์„ ๋”ฐ๋ฅด๋ฉด

๋™์  ๊ณ„ํš๋ฒ•์„ ์–ธ์ œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌ์ฒดํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ‘‡

1. ๊ฐ™์€ ๋ฐ˜๋ณต์„ ์‹œํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค.
2. ๋™์ผํ•œ ๋ฐ˜๋ณต ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์ •ํ•ด์•ผํ•œ๋‹ค.

 

๐Ÿ“Œ  Memoization

์ถ”๊ฐ€๋กœ, ์œ„ ์„ค๋ช…์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด๋ฉด

์ž‘์€ ๋ถ€๋ถ„์„ ๋‚˜๋ˆ„์–ด ํ‘ผ ๊ฒฐ๊ณผ๋ฅผ '์ €์žฅ'ํ•œ๋‹ค๊ณ  ์ ์–ด๋†“์•˜๋‹ค.

๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์ด ๋™์  ๊ณ„ํš๋ฒ•์˜ ํ•ต์‹ฌ์ด๋‹คโ—๏ธ

 

๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ €์žฅํ•ด๋‘๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ๋™์  ๊ณ„ํš๋ฒ•์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์„ ๋” ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 

๐Ÿ‘‰ DP ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š”

๋ฌด์กฐ๊ฑด ์ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์ œ๋Œ€๋กœ ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ด์•ผํ•œ๋‹ค.

์ด๋ฏธ ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ค‘๋ณตํ•ด์„œ ๋˜ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„ ๊ทธ๊ฑด DP๊ฐ€ ์•„๋‹ˆ๋‹ค.


๐Ÿ“Ž ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ณ„์‚ฐ ๊ตฌํ˜„

์ด์ „ ์žฌ๊ท€ํ•จ์ˆ˜ ๊ธ€์—์„œ๋„ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ณ„์‚ฐ์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ,

๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค,.,!!!

๋”ฐ๋ผ์„œ ์˜ค๋Š˜๋„ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ ๊ตฌํ•ด๋ณด์ž.

import Foundation

func Fibo(_ n: Int) -> Int {
    var memory = [0, 1]
    
    for i in 2...n {
        memory.append(memory[i - 1] + memory[i - 2])
    }

    return memory[n]
}

print(Fibo(4)) // 3

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

๊ทธ๋ฆฌ๊ณ  ์ €์žฅ๋œ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ ์‚ฌ์šฉํ•˜์—ฌ ๋˜ ์—ฐ์‚ฐ, ์ €์žฅ์„ ๊ณ„์†ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๊ฐ€ ์™œ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ์ง€ ์‚ดํŽด๋ณด์ž.

(์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ณ„์‚ฐ์€ ์š”๊ธฐ๐Ÿ‘‡๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

2021.07.09 - [๐Ÿ“ Algorithm Note/๐Ÿ” with Swift] - [Swift Algorithm Note] ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜ (feat. Fibonacci)

 

๐Ÿ“Œ  ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ณ„์‚ฐ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ฅธ ํšจ์œจ์„ฑ

์žฌ๊ท€ํ•จ์ˆ˜์™€ ๋™์  ๊ณ„ํš๋ฒ• ๊ฐ๊ฐ์˜ ์‹คํ–‰ ๊ณผ์ •์„ ๋น„๊ตํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋”ฐ์ ธ๋ณด์ž.

 

#1 ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„

๋งŒ์•ฝ n์œผ๋กœ 4๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์‹œํ–‰๋˜๋Š”๋ฐ,

Fibo(2)๋ฅผ ๋‘ ๋ฒˆ ๊ณ„์‚ฐํ–ˆ๊ณ , Fibo(1)์€ ์„ธ ๋ฒˆ, Fibo(0)์€ ๋‘ ๋ฒˆ ๊ณ„์‚ฐํ–ˆ๋‹ค.

 

์œ„์—์„œ ๋งํ–ˆ๋“ฏ DP๋Š” ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋‘ ๋ฒˆํ•˜์ง€ ์•Š๋„๋ก memoization ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตณ์ด ๊ฐ™์€ ์‹œํ–‰์„ ๋ฐ˜๋ณตํ•  ํ•„์š”๋Š” ์—†์œผ๋ฏ€๋กœ, ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฐ’์€ ์ €์žฅํ•ด๋‘๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋Š” ์ž‘์€ ๊ฐ’์„ ๋Œ€์ž…ํ•ด์„œ ์ผ€์ด์Šค๋ฅผ ํ™•์ธํ–ˆ์ง€๋งŒ,

๋” ํฐ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ๋ผ๋ฉด ์ค‘๋ณต๋˜๋Š” ์‹œํ–‰์ด ๋ฌด์ˆ˜ํžˆ ๋งŽ์•„์ง€๊ฒŒ ๋œ๋‹ค.

 

#2 ๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ๊ตฌํ˜„

์œ„์™€ ๊ฐ™์ด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ ,

์•ž์˜ ๋‘ ์š”์†Œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์‹œํ–‰์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ฌด๋ฆฌ ํฐ ์ˆ˜๋ผ๋„ ์ค‘๋ณต๋˜๋Š” ์‹œํ–‰์—†์ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ‘€ ์ •๋ฆฌ

๋™์  ๊ณ„ํš๋ฒ•์˜ ๊ฐœ๋…๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊นŒ์ง€ ์•Œ์•„๋ณด์•˜๋‹ค.

 

๋™์  ๊ณ„ํš๋ฒ•์€ ํ•œ ๋งˆ๋””๋กœ, '์ €์žฅ์˜ ๋ฐ˜๋ณต'์ด๋ผ๊ณ  ์š”์•ฝํ•˜๊ณ ์‹ถ๋‹ค.

 

๋™์  ๊ณ„ํš๋ฒ•์€ ์ง€๊ธˆ๊นŒ์ง€ ๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฌธ์ œ์—์„œ๋„ ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์‰ฌ์šด ๋ฌธ์ œ์—์„œ๋Š” ๋‚ด๊ฐ€ ์“ฐ๋Š”๊ฒŒ ๋™์  ๊ณ„ํš๋ฒ•์ธ์ง€ ๋ญ”์ง€๋„ ๋ชจ๋ฅด๊ณ ์„œ๋„ ์ž˜ ์ผ์ง€๋งŒ

์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ๋“ค์„ ์ ‘ํ•˜๋ฉด์„œ๋Š” ์–ธ์ œ dp๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€,

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•  ๋•Œ์˜ ํšจ์œจ์„ฑ ๋“ฑ์„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋Œ“๊ธ€