우리 할머니도 이해한다 - [백준]17626 파이썬

환리·2025년 2월 8일

백준

목록 보기
2/3
post-thumbnail

✔️문제

라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 12으로 표현할 수도 있다. 역사적으로 암산의 명수들에게 공통적으로 주어지는 문제가 바로 자연수를 넷 혹은 그 이하의 제곱수 합으로 나타내라는 것이었다. 1900년대 초반에 한 암산가가 15663 = 1252 + 62 + 12 + 12라는 해를 구하는데 8초가 걸렸다는 보고가 있다. 좀 더 어려운 문제에 대해서는 56초가 걸렸다: 11339 = 1052 + 152 + 82 + 52.
자연수 n이 주어질 때, n을 최소 개수의 제곱수 합으로 표현하는 컴퓨터 프로그램을 작성하시오.


⌨️입력

입력은 표준입력을 사용한다. 입력은 자연수 n을 포함하는 한 줄로 구성된다. 여기서, 1 ≤ n ≤ 50,000이다.


🖥️ 출력

출력은 표준출력을 사용한다. 합이 n과 같게 되는 제곱수들의 최소 개수를 한 줄에 출력한다.


분류

다이나믹프로그래밍(DP), 일반수학(math)


✔️풀이

자세한 풀이는 사진에서 설명합니다.
진짜 저만큼 자세히 설명해주는 블로그 몇개 없습니다.

[빠른 복붙을 위한 전체 코드] pypy로 돌려야 합니다.

n = int(input())
dp = [0, 1]
for i in range(2, n+1):
    min_ = 4
    j = 1
    while (j**2) <= i:
        min_ = min(min_, dp[i-j**2])
        j += 1
    dp.append(min_ + 1)
print(dp[n])



결과

시간메모리
120ms112088 KB

👁️‍🗨️ 코멘트

i) 제법 어렵다. 인정하자.

???: 아 별로 안 어렵던데~~ ㅋㅋ?
???: 이걸 못 푸노 ㅋㅋ~?

이런거에 휘둘리지 말자.
적어도 내가 느끼기에는 충분히 어려운 문제다.

ii) 이런 거는.. 발상문제다. 못 풀어도 괜찮다.

  • DP에 익숙하지 않으면, 당연히 발상이 잘 안떠오르고, 규칙도 잘 모르는게 당연하다.
    너무 위축되고, 자책하지 말고 차근차근 공부해 나가다 보면
    그냥 관성적으로 발상이 떠오른다.
    딱 거기까지만 힘내보자.
profile
늙고병듦.

0개의 댓글