Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 1699๋ฒˆ - ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ (dp)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 16. 17:11
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ๋งํฌ

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

 

1699๋ฒˆ: ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ

์–ด๋–ค ์ž์—ฐ์ˆ˜ N์€ ๊ทธ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 11=32+12+12(3๊ฐœ ํ•ญ)์ด๋‹ค. ์ด๋Ÿฐ ํ‘œํ˜„๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, 11์˜ ๊ฒฝ์šฐ 11=22+22+12+12+12(5๊ฐœ ํ•ญ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด IDEA

์šฐ์„  dp ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚˜๋ฉด, ๊ทœ์น™์„ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ˆ˜๊ธฐ๋กœ ์จ๋ณธ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. ๋ฌธ์ œ์˜ ๊ทœ์น™์ด ๋ณด์ผ๋“ฏ, ๋ณด์ด์ง€ ์•Š์•˜๋‹ค.  dp ๋ฐฐ์—ด์— 1์ผ๋•Œ ํ•ญ์˜ ์ˆ˜ 1, 2์ผ๋•Œ ํ•ญ์˜ ์ˆ˜ 2, 3์ผ๋•Œ ํ•ญ์˜ ์ˆ˜ 3, 4์ผ๋•Œ ํ•ญ์˜ ์ˆ˜ 1.. ์ด๋ ‡๊ฒŒ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋Š” ๊ฑด ์•Œ๊ฒ ๋‹ค. ๊ทผ๋ฐ ์ด์ œ ์–ด๋–ป๊ฒŒ ์ ํ™”์‹์„ ๋งŒ๋“ค์–ด์•ผํ• ๊นŒ?

์šฐ์„  ๋‚˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋“ค๊ณผ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ฒƒ์ด๋‹ค.

  • ์ž…๋ ฅ๋ฐ›์„ n , ํ•ญ์˜ ์ˆ˜๋ฅผ ๋„ฃ์–ด๋†“๋Š” ๋ฐฐ์—ด dp, ํ˜„์žฌ์˜ ์ˆ˜๋ฅผ ์ง€์นญํ•˜๋Š” i, ์ œ๊ณฑ๊ทผ์œผ๋กœ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๋”ฐ์ ธ๋ณผ j
let n = Int(readLine()!)!
var dp = Array(repeating: 0, count: n+1)

์ด์ œ ๊ทœ์น™์„ ์ฐพ์•„๋ณด์ž. ์œ„ ์˜ˆ์‹œ๋“ค ์ค‘์—์„œ ์ ๋‹นํžˆ 2์ œ๊ณฑ๊ทผ๊ณผ 1์ œ๊ณฑ๊ทผ์ด ์„ž์—ฌ์žˆ๋Š” 6์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด์ž. 6์€ 2์ œ๊ณฑ + 1์ œ๊ณฑ + 1์ œ๊ณฑ์œผ๋กœ 3๊ฐœ์˜ ํ•ญ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค. 

2์ œ๊ณฑ์€ dp[4] ์ผ๋•Œ ๊ตฌ์„ฑ๋˜๋Š” ํ•ญ์ด๊ณ , 1์ œ๊ณฑ+1์ œ๊ณฑ์€ dp[2] ๊ฐ€ ๊ตฌ์„ฑ๋ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํ•ญ์ด๋‹ค. ์ด๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • dp[6] = dp[4] + dp[2] = dp[2^2] + dp[2]

๋งŒ์•ฝ 6์ด๋ผ๋ฉด, 3^2 ์€ ํ•ญ์„ ์ด๋ฃฐ ์ˆ˜ ์—†๋‹ค ์ด์ ์„ ํ™œ์šฉํ•˜์—ฌ ์‹์„ ์„ธ์›Œ๋ณด๋ฉด, dp[6]์„ ์ดˆ๊ธฐํ™”ํ• ๋•Œ 6 > 2^2 ๊ฐ€ ๋˜์–ด์•ผํ•œ๋‹ค.์ด๋ฅผ if ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋„ฃ๊ณ , 6์„ i๋กœ, ์ œ๊ณฑ๊ทผ์„ ํ‘œํ˜„ํ•˜๋Š” 2๋ฅผ j ๋กœ ๋„ฃ์–ด๋ณด์ž.

for i in 1..<n+1 {
    dp[i] = i
    for j in 1..<i+1{
        // ์ œ๊ณฑ์ˆ˜๊ฐ€ ํ˜„์žฌ i ๋ณด๋‹ค ์ปค์ง€๋ฉด break
        if i < j*j {
            break
        }
        if dp[i] > dp[i-(j*j)] {
            dp[i] = dp[i-(j*j)] + 1
        }
    }
}

dp[i] = i ๋ฅผ ๋„ฃ๋Š” ์ด์œ ๋Š”, ์ตœ๋Œ€๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ํ•ญ์„ ์ผ๋‹จ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์–ด์ฐจํ”ผ ์ตœ์†Œ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ํ•ญ์„ ๋„ฃ์–ด์ค€ ํ›„, ๋‚˜์ค‘์— dp[i]๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. (dp[6] = 6 ์ด ๋˜๋Š”๋ฐ, 1^2์„ 6๋ฒˆ ๋”ํ•˜๋Š” ๊ฒƒ์ด ์ตœ๋Œ€ ํ•ญ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ์•ž์—์„œ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ๋˜ 6 < 3^2 ์„ ์ฒซ๋ฒˆ์žฌ if ๋ฌธ์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ๋‹ค. 6์€ 3์˜ ์ œ๊ณฑ ์ด์ƒ์œผ๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, j๋กœ 3์„ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ„ for๋ฌธ์„ ํƒˆ์ถœํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰ if ๋ฌธ์ด ํ•ต์‹ฌ์ด๋‹ค. ์—ฌ๊ธฐ์„œ dp[i] > dp[i-(j*j)] ๋ฅผ ๋ณด์ž. ์™œ ์ด์กฐ๊ฑด์ด ๋‚˜์™”๋Š”๊ฐ€? ์šฐ๋ฆฌ๋Š” dp[6]์„ ์ด๋ฃจ๋Š” ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์—, ์ž‘์€ ํ•ญ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ์ง€์†์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ์˜ dp[i]๊ฐ€ ๋” ํฌ๋ฉด ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด ๋ชจ๋“  ์†Œ์Šค๋ฅผ ํ•ฉ์นœ ์†Œ์Šค์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ

let n = Int(readLine()!)!
var dp = Array(repeating: 0, count: n+1)

for i in 1..<n+1 {
    dp[i] = i
    for j in 1..<i+1{
        // ์ œ๊ณฑ์ˆ˜๊ฐ€ ํ˜„์žฌ i ๋ณด๋‹ค ์ปค์ง€๋ฉด break
        if i < j*j {
            break
        }
        if dp[i] > dp[i-(j*j)] {
            dp[i] = dp[i-(j*j)] + 1
        }
    }
}

print(dp[n])
๋ฐ˜์‘ํ˜•