[python]λ°±μ€€ 1699번 : 제곱수의 ν•©

μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ 제좜 μ •λ‹΅ λ§žμ€ μ‚¬λžŒ μ •λ‹΅ λΉ„μœ¨
2 초 128 MB 20321 8384 6181 41.113%

문제

μ–΄λ–€ μžμ—°μˆ˜ N은 그보닀 μž‘κ±°λ‚˜ 같은 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 11=32+12+12(3개 ν•­)이닀. 이런 ν‘œν˜„λ°©λ²•μ€ μ—¬λŸ¬ 가지가 될 수 μžˆλŠ”λ°, 11의 경우 11=22+22+12+12+12(5개 ν•­)도 κ°€λŠ₯ν•˜λ‹€. 이 경우, μˆ˜ν•™μž μˆŒν¬λΌν…ŒμŠ€λŠ” “11은 3개 ν•­μ˜ 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.”라고 λ§ν•œλ‹€. λ˜ν•œ 11은 그보닀 적은 ν•­μ˜ 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μ—†μœΌλ―€λ‘œ, 11을 κ·Έ ν•©μœΌλ‘œμ¨ ν‘œν˜„ν•  수 μžˆλŠ” 제곱수 ν•­μ˜ μ΅œμ†Œ κ°œμˆ˜λŠ” 3이닀.

주어진 μžμ—°μˆ˜ N을 μ΄λ ‡κ²Œ μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ ν‘œν˜„ν•  λ•Œμ— κ·Έ ν•­μ˜ μ΅œμ†Œκ°œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N이 주어진닀. (1 ≤ N ≤ 100,000)

좜λ ₯

주어진 μžμ—°μˆ˜λ₯Ό 제곱수의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό λ•Œμ— κ·Έ 제곱수 ν•­μ˜ μ΅œμ†Œ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

λ‚˜μ˜ λ‹΅

import math

def subMaxPow(n,arr):
    if n==2:
        arr.append(1)
        arr.append(1)
        return arr

    m = int(math.sqrt(n)))
    arr.append(m)

    return subMaxPow(n-pow(m,2))


num = int(input())
print(subMaxPow(num))

ν‹€λ ΈμŠ΅λ‹ˆλ‹Ή

κ·Έλƒ₯ ν•΄λ‹Ή μˆ˜λ³΄λ‹€ μž‘μ€ μ΅œλŒ€μ˜ 제곱수λ₯Ό 계속 λΉΌκ°€λ©΄μ„œ 1이 λ‚˜μ˜¬ λ•ŒκΉŒμ§€ 반볡

import math

def isitPow(thing):
    if not(math.sqrt(thing)-int(math.sqrt(thing))): # 제곱수라면
        return 1
    else:
        return 0

def subMaxPow(n,l):
    if isitPow(n):
        return l+1
    elif n==0 or n==1 or n==2 or n==3:
        return l+n

    tmp_arr = list()
    m = int(math.sqrt(n))
    half_n = int(math.sqrt(n/2))
    for i in range(half_n,m+1):
        tmp_arr.append(i)

    min = 987654321
    for obj in tmp_arr: # μ΅œλŒ€ N^(1/2)
        tmp = subMaxPow(n-pow(obj,2),l+1) # μ΅œλŒ€ 깊이 logn
        if tmp<min:
            min = tmp

    return min


num = int(input())
tmp = subMaxPow(num,0)
print(tmp)

μ‹œκ°„ 초과

'루트 1/2*N 이상 루트 N μ΄ν•˜'의 μˆ˜λ“€μ„ 가지고, ν•˜λ‚˜μ”© μ ‘κ·Όν•˜λ©΄μ„œ 제곱 수λ₯Ό λΉΌλŠ” λ°©μ‹μœΌλ‘œ μž¬κ·€ν•¨μˆ˜λ₯Ό κ΅¬ν˜„

수의 ν›„λ³΄λŠ” μ΅œλŒ€ '루트 N' 개이고, μž¬κ·€ν•¨μˆ˜μ˜ κΉŠμ΄κ°€ μ΅œλŒ€ 'log n'μ΄μ–΄μ„œ, μ‹œκ°„ λ³΅μž‘λ„λŠ” N^(1/2*logn) 이닀. N의 λ²”μœ„κ°€ μ΅œλŒ€ 10^6 κΉŒμ§€ μ΄λ―€λ‘œ λ„ˆλ¬΄ λ§Žμ€ μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.

κ²°κ΅­ 풀지 λͺ»ν•˜μ˜€μŒ

 

λ‹€λ₯Έ λ‹΅

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜λŠ” 문제

μž…λ ₯된 수 μ΄μ „κΉŒμ§€μ˜ 제곱수λ₯Ό μ΄μš©ν•΄μ„œ ν•΄λ‹Ή 수λ₯Ό ν‘œν˜„ν•˜λ©°, ν‘œν˜„ν•œ μˆ˜λŠ” 주어진 λ²”μœ„ 값인 100,000의 λ£¨νŠΈκ°’μΈ 317κΉŒμ§€λ§Œ μ €μž₯ν•œλ‹€.

https://pacific-ocean.tistory.com/205?category=810810

 

깨달은 점

μ™„μ „ 탐색 => λΆ„ν•  μ •λ³΅μœΌλ‘œ κ°€λŠ” μƒκ°μ˜ 흐름은 μ’‹μ•˜μ§€λ§Œ,

  1. 제발 λͺ¨λ₯΄κ² μœΌλ©΄ 1λΆ€ν„° μ¨λ³΄λ©΄μ„œ κ·œμΉ™μ„ 보자
  2. λ‹€ λ¬΄μ‹ν•˜κ²Œ κ³„μ‚°ν•˜λŠ” 것도 μƒκ°ν•΄λ΄€μœΌλ©΄ (μ™„μ „ 탐색), λ‹€ λ¬΄μ‹ν•˜κ²Œ μ €μž₯ν•˜λŠ” 것도 μƒκ°ν•΄λ³΄μž (λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°)
λ°˜μ‘ν˜•