๐Ÿง‘๐Ÿป‍๐Ÿ’ป Coding Test

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Dynamic Programming) / ๋™์  ๊ณ„ํš๋ฒ•

EarthSea 2024. 4. 11. 16:30

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ( ๋™์  ๊ณ„ํš๋ฒ• ) ์ด๋ž€?

ํ•œ ๋ฒˆ ์—ฐ์‚ฐ๋œ ๊ฐ’์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์—ฐ์‚ฐํ•˜์ง€ ์•Š๋„๋ก ์ด๋ฏธ ์—ฐ์‚ฐ๋œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

๋Œ€ํ‘œ์ ์ธ ์˜ˆ : ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด ์žˆ๋‹ค.

 

์ถœ์ฒ˜ : ์œ„ํ‚คํ”ผ๋””์•„

 

์œ„์™€ ๊ฐ™์ด ์ •์˜๊ฐ€ ๋œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€

F(3) = F(1) + F(2)

F(4) = F(2) + F(3)

...

์œผ๋กœ ๊ณ„์‚ฐ์ด ๋˜๋ฏ€๋กœ ๋ฐ˜๋ณต์ ์ธ ๊ณ„์‚ฐ์ด ๋‚˜์˜จ๋‹ค.

์ด์ „์— ๊ณ„์‚ฐ๋œ F(3)์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด ๋‘”๋‹ค๋ฉด, F(4)๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ, F(3)์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด ๋ฐฉ์‹

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ’€์ด ๋ฐฉ์‹์€ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

 

ํƒ‘๋‹ค์šด ๋ฐฉ์‹ ( Top-Down ๋ฐฉ์‹ )

ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ( ํ•˜ํ–ฅ์‹ ๋ฐฉ๋ฒ• )

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

 

์œ„์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ํƒ‘๋‹ค์šด ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด์ž.

var dp = [Int](repeating: 0, count: 101)

dp[1] = 1
dp[2] = 1

//ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
func fibo(_ n: Int) -> Int {
	if dp[n] != 0 {
    	return dp[n]
    }
    
    dp[n] = fibo(n-1) + fibo(n-2)
    return dp[n]
}

 

 

๋ณดํ…€์—… ๋ฐฉ์‹ ( Bottom-Up ๋ฐฉ์‹ )

์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ•ด๊ฒฐํ•˜๊ณ , ํ•ด๊ฒฐ๋œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ชจ์•„ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ for๋ฌธ์œผ๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ( ์ƒํ–ฅ์‹ ๋ฐฉ๋ฒ• )

ํƒ‘๋‹ค์šด ๋ฐฉ์‹๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ž‘์€ ์ˆ˜์—์„œ ํฐ ์ˆ˜๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด ๋ฐฉ์‹์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฐ์—ด์„ DP ํ…Œ์ด๋ธ” ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์œ„์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋ณดํ…€์—… ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด์ž.

var dp = [Int](repeating: 0, count : 101)

dp[1] = 1
dp[2] = 1

func fibo(_ n: Int) -> Int {
	for i in 3...n {
    	dp[i] = dp[i-1] + dp[i-2]
    }
    
    return dp[n]
}

 

 

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

 

 

์˜ˆ์‹œ๋ฌธ์ œ

 

๋ฐฑ์ค€ 1463๋ฒˆ : 1๋กœ ๋งŒ๋“ค๊ธฐ

https://www.acmicpc.net/problem/1463

 

1463๋ฒˆ: 1๋กœ ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์— 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 106๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

ํ’€์ด ๋ฐฉ๋ฒ•

let x = Int(readLine()!)!

var dp = [Int](repeating: 0, count: x+1)

for i in 2..<x+1 {
    dp[i] = dp[i-1] + 1
    
    if i % 2 == 0 {
        dp[i] = min(dp[i], dp[i/2] + 1)
    }
    if i % 3 == 0 {
        dp[i] = min(dp[i], dp[i/3] + 1)
    }
}

print(dp[x])