ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

1699번: 제곱수의 ν•©

μ–΄λ–€ μžμ—°μˆ˜ N은 그보닀 μž‘κ±°λ‚˜ 같은 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 11=32+12+12(3개 ν•­)이닀. 이런 ν‘œν˜„λ°©λ²•μ€ μ—¬λŸ¬ 가지가 될 수 μžˆλŠ”λ°, 11의 경우 11=22+22+12+12+12(5개 ν•­)도 κ°€λŠ₯ν•˜λ‹€

www.acmicpc.net

 

문제 풀이

 μžμ—°μˆ˜ N이 주어지면 ν•΄λ‹Ή 수λ₯Ό μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό λ•Œ ν•­μ˜ μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. N에 λ”°λΌμ„œ ν•­μ˜ μ΅œμ†Œ 개수λ₯Ό λΉ„κ΅ν•˜λ©΄ 문제λ₯Ό μ‰½κ²Œ ν’€ 수 μžˆλ‹€.

 

N ν•­ ν•­μ˜ μ΅œμ†Œ 개수
0 μ—†μŒ 0
1 1 ^ 2 1
2 1 ^ 2 + 1 ^ 2 2
3 1 ^ 2 + 1 ^ 2 + 1 ^ 2 3
4 2 ^ 2 1
5 2 ^ 2 + 1 ^ 2 2
6 2 ^ 2 + 1 ^ 2 + 1 ^ 2 3
7 2 ^ 2 + 1 ^ 2 + 1 ^ 2 + 1 ^ 2 4
8 2 ^ 2 + 2 ^ 2 2
9 3 ^ 2 1

 μœ„와 같이 N이 증가함에 따라 κ·œμΉ™μ„±μ„ κ°™λŠ” 것을 μ•Œ 수 μžˆλ‹€.  μ΄λ‘œμ¨ 점화식은 f(n) = min(f(n), f(κ°€λŠ₯ν•œ μ΅œλŒ€μ œκ³±μˆ˜) + 1)κ°€ λœλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. ν‘œμ™€ 점화식이 이해가 μž˜λ˜μ§€ μ•Šλ”λΌλ„ μ½”λ“œλ₯Ό 보고 이해할 수 μžˆλ‹€.

 

μ½”λ“œ

from sys import stdin

if __name__ == '__main__':
    n = int(stdin.readline())

    answer = [0] * (n + 1)

    for i in range(1, n + 1):
        answer[i] = i
        for j in range(1, i):
            if j * j > i:
                break
            if answer[i] > answer[i - j * j] + 1:
                answer[i] = answer[i - j * j] + 1
    print(answer[n])

 9인 경우 κ³„μ‚°λ˜λŠ” 과정을 보면, λ‹€μŒκ³Ό κ°™λ‹€.

  • λ°˜λ³΅λ¬Έμ„ μ‹œμž‘ν•˜λ©΄, 9의 인덱슀둜 μ΄ˆκΈ°ν™” ν•œλ‹€. (μ΄λŠ” λͺ¨λ‘ 1^2으둜 λ‚˜νƒ€λƒ„μ„ μ˜λ―Έν•œλ‹€)
  • jλ₯Ό 증가 μ‹œν‚€λ©΄μ„œ 9의 경우 2^2, 3^3을 경우의 수둜 λ‘˜ 수 μžˆλ‹€.
    • [9 - 2^2] + 1은 N:5 + 1을 μ˜λ―Έν•œλ‹€ 즉 2^2 + 2^2 + 2^1을 μ˜λ―Έν•œλ‹€.
    • [9 - 3^2] + 1은 N:0 + 1을 μ˜λ―Έν•œλ‹€. 즉 3^2λ₯Ό μ˜λ―Έν•œλ‹€.
    • 9, 3, 1 쀑 μ΅œμ†Œ 값은 1μ΄λ―€λ‘œ 9λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 제곱수 ν•­μ˜ μ΅œμ†Œ 값을 찾을 μˆ˜μžˆλ‹€.
 μ΄μ™€ 같이 i(N)κ°€ 증가 ν•  수둝 항에 μ μš©ν•  수 μžˆλŠ” μ œκ³±μˆ˜λŠ” μ¦κ°€ν•˜λ―€λ‘œ, κ°€μž₯ 큰 μ œκ³±μˆ˜κ°€ λ§Œμ‘±ν•˜κ³ , 이전 값을 λ©”λͺ¨μ΄μ œμ΄μ…˜ν•˜μ˜€κΈ°μ— 닡을 찾을 수 μžˆλ‹€.
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€