🧩 Algorithm/[BOJ] Bronze

BOJ 2851번 : 슈퍼 마리였 (Python/Bronze 1)

devCloud 2023. 3. 21. 21:26
728x90
 

2851번: 슈퍼 마리였

첫째 쀄에 λ§ˆλ¦¬μ˜€κ°€ λ°›λŠ” 점수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 100에 κ°€κΉŒμš΄ μˆ˜κ°€ 2개라면 (예: 98, 102) λ§ˆλ¦¬μ˜€λŠ” 큰 값을 μ„ νƒν•œλ‹€.

www.acmicpc.net

문제

슈퍼 마리였 μ•žμ— 10개의 버섯이 일렬둜 놓여져 μžˆλ‹€. 이 버섯을 먹으면 점수λ₯Ό λ°›λŠ”λ‹€. 슈퍼 λ§ˆλ¦¬μ˜€λŠ” 버섯을 μ²˜μŒλΆ€ν„° λ‚˜μ˜¨ μˆœμ„œλŒ€λ‘œ μ§‘μœΌλ €κ³  ν•œλ‹€. ν•˜μ§€λ§Œ, λͺ¨λ“  버섯을 집을 ν•„μš”λŠ” μ—†κ³  쀑간에 쀑단할 수 μžˆλ‹€. 쀑간에 버섯을 λ¨ΉλŠ” 것을 μ€‘λ‹¨ν–ˆλ‹€λ©΄, κ·Έ 이후에 λ‚˜μ˜¨ 버섯은 λͺ¨λ‘ 먹을 수 μ—†λ‹€. λ”°λΌμ„œ 첫 버섯을 λ¨Ήμ§€ μ•Šμ•˜λ‹€λ©΄, κ·Έ 이후 버섯도 λͺ¨λ‘ 먹을 수 μ—†λ‹€. λ§ˆλ¦¬μ˜€λŠ” 받은 점수의 합을 μ΅œλŒ€ν•œ 100에 κ°€κΉκ²Œ λ§Œλ“€λ €κ³  ν•œλ‹€. λ²„μ„―μ˜ μ μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λ§ˆλ¦¬μ˜€κ°€ λ°›λŠ” 점수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

총 10개의 쀄에 각각의 λ²„μ„―μ˜ μ μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 이 값은 100보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€. 버섯이 λ‚˜μ˜¨ μˆœμ„œλŒ€λ‘œ μ μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€.

 

좜λ ₯

첫째 쀄에 λ§ˆλ¦¬μ˜€κ°€ λ°›λŠ” 점수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 100에 κ°€κΉŒμš΄ μˆ˜κ°€ 2개라면 (예: 98, 102) λ§ˆλ¦¬μ˜€λŠ” 큰 값을 μ„ νƒν•œλ‹€.


예제 μž…λ ₯

1
2
3
5
8
13
21
34
55
89

예제 좜λ ₯

87

μ„€λͺ…

μ μˆ˜κ°€ λΆ€μ—¬λœ 10개의 버섯이 μžˆλ‹€. μˆœμ„œλŒ€λ‘œ μ§‘μ–΄ λ¨ΉλŠ”λ° 100점에 κ°€κΉŒμš΄ μ μˆ˜κ°€ λ˜μ–΄μ•Ό ν•œλ‹€. 단, λ¨Ήλ‹€κ°€ 멈좜 순 μžˆμ§€λ§Œ 멈좘 μ΄ν›„λ‘œλŠ” λ¨Ήμ§€ λͺ»ν•œλ‹€. 

 

풀이

- λˆ„μ  ν•© 이용

 

λˆ„μ  ν•© κ΅¬ν•˜λŠ” μ½”λ“œ

array = [10, 20, 30, 40, 50]
n = len(array)
prefix_sum = [0] * (n + 1)

for i in range(n):
    prefix_sum[i + 1] = prefix_sum[i] + array[i]
   
 κ²°κ³Ό : prefix_sum[0, 10, 30, 60, 100, 150]

λˆ„μ  ν•© μ•Œκ³ λ¦¬μ¦˜ μ„€λͺ… - https://dev-cloud.tistory.com/141

주의 사항

- 100에 κ°€κΉŒμš΄ μˆ˜κ°€ 두 개면 큰 값을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

- λ²„μ„―μ˜ λˆ„μ  합계가 100이상이 λœλ‹€λŠ” 보μž₯이 μ—†λ‹€. 

Solution

n = []
for _ in range(10):
    n.append(int(input()))
    
prefix_sum = [0]*11 #λˆ„μ  합을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ³€μˆ˜
s, e = 0 #100보닀 μž‘μ€ 수, 큰 수λ₯Ό λΉ„κ΅ν•˜κΈ° μœ„ν•œ λ³€μˆ˜

for i in range(10):
    prefix_sum[i+1] = prefix_sum[i] + n[i] #λˆ„μ  ν•©
    
    if prefix_sum[i+1] >= 100: #100보닀 ν¬κ±°λ‚˜ κ°™μ•„μ§€λ©΄ 100μ΄ν•˜/이상값을 μ €μž₯ν•˜κ³  반볡문 쀑단
        s = prefix_sum[i]
        e = prefix_sum[i+1]
        break
    else: #λˆ„μ  합이 100이상이 μ•ˆ 될 경우λ₯Ό λŒ€λΉ„ν•΄ 값을 맀번 κ°±μ‹ 
        s = prefix_sum[i]
        e = prefix_sum[i+1]

#100μ΄ν•˜, 100μ΄μƒμ˜ 값을 λΉ„κ΅ν•΄μ„œ 좜λ ₯ν•œλ‹€.
if 100 - s == e - 100: 
    print(e)
elif 100 - s <= e - 100:
    print(s)
else:
    print(e)

Another Solution

ans,score = 0,0
for i in range(10):
    score+=int(input()) #μž…λ ₯κ³Ό λ™μ‹œμ— λˆ„μ  합을 κ΅¬ν•œλ‹€.
    if 100-ans >= abs(100-score): #100κ³Ό κ°€κΉŒμš΄ 두 수λ₯Ό λΉ„κ΅ν•œλ‹€. 
        ans = score
print(ans)
728x90