We will find a way, we always have.

-interstellar

Problem Solving/λ°±μ€€

[λ°±μ€€] 17626번: Four Squares - 파이썬

Redddy 2022. 6. 20. 01:47

πŸ”ˆ 문제

λΌκ·Έλž‘μ£ΌλŠ” 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