[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ | Python] μ˜ˆμ‚°

2022. 7. 4. 14:25

πŸ“’  문제 정보

 

 

πŸ”’  문제 μ„€λͺ…

더보기

문제 μ„€λͺ…

Sμ‚¬μ—μ„œλŠ” 각 λΆ€μ„œμ— ν•„μš”ν•œ λ¬Όν’ˆμ„ 지원해 μ£ΌκΈ° μœ„ν•΄ λΆ€μ„œλ³„λ‘œ λ¬Όν’ˆμ„ κ΅¬λ§€ν•˜λŠ”λ° ν•„μš”ν•œ κΈˆμ•‘μ„ μ‘°μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, 전체 μ˜ˆμ‚°μ΄ μ •ν•΄μ Έ 있기 λ•Œλ¬Έμ— λͺ¨λ“  λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해 쀄 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ΅œλŒ€ν•œ λ§Žμ€ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해 쀄 수 μžˆλ„λ‘ ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

λ¬Όν’ˆμ„ ꡬ맀해 쀄 λ•ŒλŠ” 각 λΆ€μ„œκ°€ μ‹ μ²­ν•œ κΈˆμ•‘λ§ŒνΌμ„ λͺ¨λ‘ 지원해 μ€˜μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 1,000원을 μ‹ μ²­ν•œ λΆ€μ„œμ—λŠ” μ •ν™•νžˆ 1,000원을 지원해야 ν•˜λ©°, 1,000원보닀 적은 κΈˆμ•‘μ„ 지원해 쀄 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

λΆ€μ„œλ³„λ‘œ μ‹ μ²­ν•œ κΈˆμ•‘μ΄ λ“€μ–΄μžˆλŠ” λ°°μ—΄ d와 μ˜ˆμ‚° budget이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ΅œλŒ€ λͺ‡ 개의 λΆ€μ„œμ— λ¬Όν’ˆμ„ 지원할 수 μžˆλŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œ 사항

  • dλŠ” λΆ€μ„œλ³„λ‘œ μ‹ μ²­ν•œ κΈˆμ•‘μ΄ λ“€μ–΄μžˆλŠ” 배열이며, 길이(전체 λΆ€μ„œμ˜ 개수)λŠ” 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
  • d의 각 μ›μ†ŒλŠ” λΆ€μ„œλ³„λ‘œ μ‹ μ²­ν•œ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λ©°, λΆ€μ„œλ³„ μ‹ μ²­ κΈˆμ•‘μ€ 1 이상 100,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • budget은 μ˜ˆμ‚°μ„ λ‚˜νƒ€λ‚΄λ©°, 1 이상 10,000,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

d budget result
[1,3,2,5,4] 9 3
[2,2,3,3] 10 4

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
각 λΆ€μ„œμ—μ„œ [1원, 3원, 2원, 5원, 4원]만큼의 κΈˆμ•‘μ„ μ‹ μ²­ν–ˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½μ—, 1원, 2원, 4원을 μ‹ μ²­ν•œ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해주면 μ˜ˆμ‚° 9μ›μ—μ„œ 7원이 μ†ŒλΉ„λ˜μ–΄ 2원이 λ‚¨μŠ΅λ‹ˆλ‹€. 항상 μ •ν™•νžˆ μ‹ μ²­ν•œ κΈˆμ•‘λ§ŒνΌ 지원해 μ€˜μ•Ό ν•˜λ―€λ‘œ 남은 2μ›μœΌλ‘œ λ‚˜λ¨Έμ§€ λΆ€μ„œλ₯Ό 지원해 μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μœ„ 방법 외에 3개 λΆ€μ„œλ₯Ό 지원해 쀄 방법듀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 1원, 2원, 3원을 μ‹ μ²­ν•œ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해주렀면 6원이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 1원, 2원, 5원을 μ‹ μ²­ν•œ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해주렀면 8원이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 1원, 3원, 4원을 μ‹ μ²­ν•œ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해주렀면 8원이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 1원, 3원, 5원을 μ‹ μ²­ν•œ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해주렀면 9원이 ν•„μš”ν•©λ‹ˆλ‹€.

3개 λΆ€μ„œλ³΄λ‹€ 더 λ§Žμ€ λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해 쀄 μˆ˜λŠ” μ—†μœΌλ―€λ‘œ μ΅œλŒ€ 3개 λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2
λͺ¨λ“  λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해주면 10원이 λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ΅œλŒ€ 4개 λΆ€μ„œμ˜ λ¬Όν’ˆμ„ ꡬ맀해 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ”‘  문제 풀이

μ‹œλ„ 1. 완전탐색 - μ‹€νŒ¨ (μ‹œκ°„μ΄ˆκ³Ό)

import itertools

def solution(d, budget):
    tmp = []
    
    for i in range(len(d)+1):
        coms = itertools.combinations(d, i)
        for c in coms:
            if sum(c) <= budget:
                tmp.append(len(c))
    return max(tmp)

μ™„μ „νƒμƒ‰μœΌλ‘œ 풀어보렀 ν–ˆμœΌλ‚˜, ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 7λΆ€ν„°λŠ” μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ™”λ‹€. λ”°λΌμ„œ λͺ¨λ“  경우의 수λ₯Ό λ”°μ§€κΈ°λ³΄λ‹€λŠ” λ”μš± 효율적인 풀이λ₯Ό μ°Ύμ•„λ³΄κ³ μž ν–ˆλ‹€.

 

방법 1. μ΅œλŒ“κ°’ λΉΌλ©΄μ„œ λ”ν•˜κΈ°

μ§ˆλ¬Έν•˜κΈ° κ²Œμ‹œνŒμ„ 톡해 힌트λ₯Ό μ–»μ—ˆλŠ”λ°, μ›λ¦¬λŠ” λ„ˆλ¬΄λ‚˜ κ°„λ‹¨ν•˜κ²Œλ„ 'κ°€μž₯ μž‘μ€ μˆ˜λΆ€ν„° 더해야 κ°€μž₯ λ§Žμ€ λΆ€μ„œμ—κ²Œ 지원을 해쀄 수 μžˆλ‹€'μ˜€λ‹€.

같은 μ›λ¦¬λ‘œ, λ§Œμ•½ λΆ€μ„œλ³„ μ‹ μ²­ κΈˆμ•‘μ˜ 합이 μ˜ˆμ‚°μ„ μ΄ˆκ³Όν•œλ‹€λ©΄ μ΅œλŒ“κ°’μ„ μ œμ™Έν•˜κ³  λ‹€μ‹œ ν™•μΈν•΄λ³΄λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν–ˆλ‹€.

def solution(d, budget):
    while True:
        if sum(d) <= budget:
            return len(d)
        else:
            d.remove(max(d))

 

방법 2. .sort() + pop() ν™œμš©ν•˜κΈ°

λ‚˜μ™€ 같은 ν’€μ΄μ΄μ§€λ§Œ 쑰금 더 λ‹¨μˆœν•˜κ²Œ ν‘Ό 풀이λ₯Ό μ°Ύμ•˜λ‹€. 사싀 거의 λΉ„μŠ·ν•˜μ§€λ§Œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œ ν•¨μˆ˜κ°€ λ‹€λ₯΄λ‹€.

def solution(d, budget):
    d.sort()
    while budget < sum(d):
        d.pop()
    return len(d)

 

 

πŸ’‘  What I learned

μ‹œκ°„λ³΅μž‘λ„λ₯Ό μƒκ°ν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ λ¬΄μž‘μ • μ™„μ „νƒμƒ‰μ΄λ‚˜, λ‚΄κ°€ μ•„λŠ” λ°©μ‹μœΌλ‘œ ν’€λ €λŠ” κ²½ν–₯이 μžˆλ‹€. μˆ˜ν•™μ μœΌλ‘œ μ ‘κ·Όν•˜μ—¬ 문제λ₯Ό 훨씬 κ°„λ‹¨νžˆ ν’€ 쀄 μ•„λŠ” ν›ˆλ ¨μ΄ ν•„μš”ν•  λ“― ν•˜λ‹€.

BELATED ARTICLES

more