https://www.acmicpc.net/status?user_id=chch4569&problem_id=2851&from_mine=1
채점 현황
www.acmicpc.net
문제
슈퍼 마리오 앞에 10개의 버섯이 일렬로 놓여져 있다. 이 버섯을 먹으면 점수를 받는다.
슈퍼 마리오는 버섯을 처음부터 나온 순서대로 집으려고 한다. 하지만, 모든 버섯을 집을 필요는 없고 중간에 중단할 수 있다. 중간에 버섯을 먹는 것을 중단했다면, 그 이후에 나온 버섯은 모두 먹을 수 없다. 따라서 첫 버섯을 먹지 않았다면, 그 이후 버섯도 모두 먹을 수 없다.
마리오는 받은 점수의 합을 최대한 100에 가깝게 만들려고 한다.
버섯의 점수가 주어졌을 때, 마리오가 받는 점수를 출력하는 프로그램을 작성하시오.
입력
총 10개의 줄에 각각의 버섯의 점수가 주어진다. 이 값은 100보다 작거나 같은 양의 정수이다. 버섯이 나온 순서대로 점수가 주어진다.
출력
첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.
코드 정답
import sys
input = sys.stdin.readline
# 2851번
cnt, ans = 0, 0
arr = []
for _ in range(10):
arr.append(int(input()))
while cnt <= 9:
ans += arr[cnt]
if (ans == 100):
break
elif (ans > 100):
if ans - 100 <= 100 - (ans - arr[cnt]):
break
else:
ans -= arr[cnt]
break
cnt += 1
print(ans)
풀이
1~2행 : input() 을 사용하면 느리기 때문에 sys.stdin.readline 을 사용하기 위해 sys 를 import 시켜준 후 input 에 sys.stdin.readline 을 넣어줍니다.
import sys
input = sys.stdin.readline
4~8행 : cnt, ans 값을 0으로 선언과 동시에 초기화해주고 arr 를 배열로 선언합니다. 이후 10번을 반복하면서 정수값을 입력받아 arr 에 순차적으로 대입합니다.
# 2851번
cnt, ans = 0, 0
arr = []
for _ in range(10):
arr.append(int(input()))
10~23행 : cnt 가 9 이하라면 반복됩니다. ans = ans + arr[cnt] 와 같은 말로 ans 와 arr[cnt]에 들어있는 값을 더하여 ans 에 대입합니다.
첫번째 조건(if)으로는 ans 가 100 이라면 while 문에서 빠져나와 ans 값을 출력을 하게 됩니다.
두번째 조건(elif)으로는 ans 가 100보다 크다면 중첩 조건문으로 들어가게 됩니다. 만약 ans-100을 한 값이 100 - (ans - arr[cnt]) 보다 작거나 같다면 while 문을 빠져나와 ans 를 출력합니다. 아니라면 ans = ans - arr[cnt] 와 같은 말로 ans 에서 arr[cnt]에 해당하는 값을 빼낸 후 whiel 문을 빠져나와 ans 를 출력합니다.
while cnt <= 9:
ans += arr[cnt]
if (ans == 100):
break
elif (ans > 100):
if ans - 100 <= 100 - (ans - arr[cnt]):
break
else:
ans -= arr[cnt]
break
cnt += 1
print(ans)
'BaekJoon > 누적합' 카테고리의 다른 글
[백준] 2차원 배열의 합 - 2167번 문제 (Python) (0) | 2023.03.23 |
---|---|
[백준] 기상청 인턴 신현수 - 2435번 문제 (Python) (0) | 2023.03.21 |
[백준] 구간 합 구하기 5 - 11660번 (Python) (0) | 2023.03.19 |
[백준] 수열 - 2559번 (Python) (0) | 2023.03.18 |
[백준] 구간 합 구하기 4 - 11659번 (Python) (2) | 2023.03.17 |