• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[백준] 1699번 : 제곱수의 합 with python3

13 Sep 2018

Reading time ~1 minute

문제 url :

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

목표:

  • 특정수를 제곱수의 합으로 표현했을 때에 그 항의 최소개수를 구하라

조건:

  • 1 ≤ N ≤ 100,000
  • O(N**2)이하로 O(N) 혹은 O(NlogN)이어야 한다.

solution 설명 :

main idea는 d[i]가 되기전에 어떤 제곱수의 최소항의 개수가 d[i]로 채택이 되었느냐를 구하는 것이다.

  • D의 index i는 i를 구성하는 제곱수 의 최소 개수를 넣는 것이다.
  • 일단 D[i]를 순서대로 하나씩 돈다.
    • j를 i의 루트 2까지 돌린다.
    • i 보다 작은 j의 제곱수를 빼서 D[i]가 되기 전에 온 값의 최소항 수에 +1한 값들을 구한다.
    • 그것들 중 가장 작은 값을 구해서 채운다.
import sys
n = int(sys.stdin.readline())
D = [0]*(n + 1)
for i in range(1, n + 1):
  D[i] = min([D[i - j*j] + 1 for j in range(1, int(i**0.5) + 1)])
print(D[n])



algorithm백준 Share Tweet +1