๐ ๋ฌธ์
๋ผ๊ทธ๋์ฃผ๋ 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๊ณผ ๊ฐ๊ฒ ๋๋ ์ ๊ณฑ์๋ค์ ์ต์ ๊ฐ์๋ฅผ ํ ์ค์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ํด์
1 ๋ถํฐ 50000์ค ์ ํ๋๊ฐ ์ฃผ์ด์ง ๋, ์ต์ํ์ ์ ๊ณฑ์์ ํฉ์ผ๋ก ํํํ ๋ ์ด ์ต์ํ์ ์ ๊ณฑ์์ ๊ฐฏ์๋ฅผ ๊ตฌํ๋ ์ต์ ํ ๋ฌธ์ ์ด๋ค.
์๊ฐ์ ํ์ด 0.5์ด๋ก ๋นก๋นกํ๋ค..(๊ทธ๋ฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ๋ ๋ธ๋ฃจํธํฌ์ค ๊ถ์๋ ๊ถ์๋ ,,)
์์ ์ ๋ ฅ์ธ 26์ ์๋ก ๋ค๋ฉด 26์ 1**2 + 5**2 ์ด๋ ๊ฒ ๋๊ฐ์ ์ ๊ณฑ์๋ก ํํ์ด ๊ฐ๋ฅํ์ฌ 2๋ฅผ ์ถ๋ ฅํ๋ฉด ์ ๋ต ํ์ ์ ๋ฐ๋๋ค.
dp[26] = min(dp[26-1**2], dp[26])
dp[26] = min(dp[26-2**2], dp[26])
dp[26] = min(dp[26-3**2], dp[26])
dp[26] = min(dp[26-4**2], dp[26])
dp[26] = min(dp[26-5**2], dp[26]) ๋ฅผ ๋ฐ๋ณตํ์ฌ ์ต์ ๊ฐ์ ์ฐพ์๋ธ๋ค.
๐ป ์ฝ๋
n = int(input())
dp = [i for i in range(n+1)] # dp ํ
์ด๋ธ ์ด๊ธฐํ
for i in range(1,n+1): # dp ํ
์ด๋ธ 1๋ถํฐ n๊น์ง ์ฐจ๋ก๋๋ก ๊ฐฑ์
for j in range(1,int(i**0.5)+1): # 1๋ถํฐ i์ ์ ๊ณฑ๊ทผ๊น์ง
if 0<=i-j**2: # i-j**2์ด dp ํ
์ด๋ธ ๋ฒ์ ๋ด๋ผ๋ฉด, ์ฆ i-j**2์ด ์์ฐ์๋ผ๋ฉด
dp[i] = min(dp[i-j**2]+1,dp[i]) # i-j**2์์ j**2๋ฅผ ๋ํ๊ฒ๊ณผ ํ์ฌ dp[i]์ ๋น๊ตํ ๊ฐฑ์
print(dp[n])
๐ญ ์ํ์ฐฉ์ค

์ฌ์ค ๊ธ์ ์ ๋ฆฌํ๋ค๊ฐ ์๊ฐ์ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ(for๋ฌธ์ ์กฐ๊ธ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ) ์ด ์๊ฐ๋์ ์ ์ถํ๊ณ ์๋๋ฐ, ํ์ด์ฌ์ ์ฌ์ ํ ์๊ฐ ์ด๊ณผใ ์๊ณ , pypy๋ ๊ทธ๋๋ ์๊ฐ์ด ์กฐ๊ธ ๋นจ๋ผ์ก๋ค.
ํ์ด์ฌ์ผ๋ก๋ ์๊ฐ์ด๊ณผ ์ ๋ฐ์ผ๋ ค๊ณ ์๋ํด๋ณด์์ง๋ง ์คํจ^!^
๊ทธ๋๋ dp ์ ํ์ ์ด์๊ฒ ์ธ์์ ์์ฝ๋ฉ 39์์ ๋ญํฌ๋์๋ค..

๋ณ๊ฒฝ์
for i in range(1,n+1):
for j in range(1,int(n**0.5)+1):
if 0<=i-j**2:
dp[i] = min(dp[i-j**2]+1,dp[i])
๋ณ๊ฒฝํ
for i in range(1,n+1):
for j in range(1,int(i**0.5)+1):
if 0<=i-j**2:
dp[i] = min(dp[i-j**2]+1,dp[i])
๋๋ฒ์งธ for๋ฌธ์ n์ ์ ๊ณฑ๊ทผ๊น์ง๊ฐ i์ ์ ๊ณฑ๊ทผ๊น์ง๋ก ๋ฐ๋์๋คใ
๐ ๋ฌธ์ ๋งํฌ Four Squares
'Problem Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1260๋ฒ: DFS์ BFS - ํ์ด์ฌ (0) | 2022.06.25 |
---|---|
[๋ฐฑ์ค] 1389๋ฒ: ์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น - ํ์ด์ฌ (0) | 2022.06.23 |
[๋ฐฑ์ค] 11403๋ฒ: ๊ฒฝ๋ก ์ฐพ๊ธฐ - ํ์ด์ฌ (0) | 2022.06.19 |
[๋ฐฑ์ค] 5430๋ฒ: AC - ํ์ด์ฌ (0) | 2022.06.16 |
[๋ฐฑ์ค] 13023๋ฒ: ABCDE - ํ์ด์ฌ (0) | 2022.06.15 |