λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/programmers

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Level 3 - 졜고의 집합

by HandHand 2021. 3. 1.

문제

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 졜고의 집합

풀이 κ³Όμ •

μžμ—°μˆ˜ n 개λ₯Ό μ‚¬μš©ν•΄μ„œ 총합이 Sκ°€ 되며 λ™μ‹œμ— 각 μ›μ†Œμ˜ 곱이 μ΅œλŒ€μΈ 집합을 졜고의 집합 이라고 ν‘œν˜„ν•©λ‹ˆλ‹€.

μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” ν•© Sκ°€ 1얡이고 μžμ—°μˆ˜ n의 κ°œμˆ˜λŠ” μ΅œλŒ€ 10,000 이기 λ•Œλ¬Έμ— λͺ¨λ“  쑰합을 λ§Œλ“€μ–΄λ³΄λŠ” 방법은 μ‹œκ°„λ‚΄μ— μˆ˜ν–‰μ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μ’€ 더 효율적인 방법은 μ—†μ„κΉŒμš”? λ°”λ‘œ νƒμš•μ μΈ 선택 으둜 졜적의 닡을 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 증λͺ…ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같이 μƒκ°ν•΄λ΄€μŠ΅λ‹ˆλ‹€.

μš°μ„  총 k 개의 j 합이 S λ₯Ό λ§Œμ‘±ν•œλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

j j j ... j => 총 k 개이며 합이 S, λ”°λΌμ„œ j\*k = S

합이 Sκ°€ λ˜λŠ” 숫자의 쑰합은 μƒλ‹Ήνžˆ λ‹€μ–‘ν•˜λ―€λ‘œ μ΄λ²ˆμ—λŠ” j에 μž„μ˜μ˜ μ–‘μ˜ μ •μˆ˜ l 만큼 값이 차이가 λ‚˜λŠ” 경우λ₯Ό λ”°μ Έλ³΄κ² μŠ΅λ‹ˆλ‹€.

j-l j j j .... j+l => 합은 μ—¬μ „νžˆ S

이 경우 λͺ¨λ“  μ›μ†Œμ˜ 합이 S 이기 λ•Œλ¬Έμ— ν•œ μ›μ†Œμ—μ„œ l 만큼 κ°μ†Œν–ˆμœΌλ―€λ‘œ λ‹€λ₯Έ μ›μ†Œμ—μ„œ l 만큼 값이 λ”ν•΄μ‘Œμ„ κ²ƒμž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ λͺ¨λ“  μ›μ†Œλ₯Ό κ³±ν–ˆμ„ 경우 μ–΄λ–»κ²Œ λ κΉŒμš”?

κΈ°μ‘΄μ—λŠ” j*k μ˜€μ§€λ§Œ 두 μ›μ†Œμ˜ 값이 λ‹¬λΌμ Έμ„œ (j-l)(j+l)(j*(k-2)) κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 차이가 λ°œμƒν•˜λŠ” 두 μ›μ†Œλ§Œ λΉ„κ΅ν•˜μžλ©΄ j^2-l^2 < j^2 이기 λ•Œλ¬Έμ— λͺ¨λ“  값이 κ· λ“±ν•œ 첫 번째 κ²½μš°κ°€ λͺ¨λ“  μ›μ†Œμ˜ 곱이 더 ν¬λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ 졜고의 집합을 μ°ΎκΈ° μœ„ν•΄μ„œλŠ” λͺ¨λ“  μ›μ†Œλ₯Ό μ΅œλŒ€ν•œ κ· λ“±ν•˜κ²Œ λΆ„λ°°ν•΄μ€˜μ•Όν•œλ‹€ λΌλŠ” 사싀을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œλ‘œ κ΅¬ν˜„ν• λ•ŒλŠ” Sλ₯Ό n으둜 λ‚˜λˆˆ λͺ«μ„ n 개 만큼 ν• λ‹Ήν•œ λ’€ S μ—μ„œ n을 λ‚˜λˆ΄μ„λ•Œ λ°œμƒν•œ λ‚˜λ¨Έμ§€ 값을 각 μ›μ†Œμ— κ· λ“±ν•˜κ²Œ λ‚˜λˆ μ£Όλ©΄ λ©λ‹ˆλ‹€.

κ΅¬ν˜„ μ½”λ“œ μžμ²΄λŠ” μ§§μ•˜μ§€λ§Œ λ§Žμ€ 것을 생각해볼 수 μžˆλŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

μ½”λ“œ


def solution(n, s):
    if s < n:
        return [-1]

    quo, remain = divmod(s, n)
    answer = [quo] * n

    # λ‚˜λ¨Έμ§€λ₯Ό κ· λ“±ν•˜κ²Œ λΆ„λ°°ν•œλ‹€
    idx = n-1
    for i in range(remain):
        answer[idx - i] += 1

    return answer
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€