https://www.acmicpc.net/status?user_id=chch4569&problem_id=2851&from_mine=1
채점 상태
www.acmicpc.net
문제
슈퍼마리오 앞에 10개의 버섯이 일렬로 놓여 있습니다. 이 버섯을 먹으면 포인트를 줍니다.
슈퍼마리오는 버섯이 나온 순서대로 줍는다. 그러나 모든 버섯을 모을 필요는 없으며 중간에 멈출 수 있습니다. 중간에 버섯을 먹지 않으면 그 뒤에 오는 버섯은 먹을 수 없게 된다. 그래서 첫 번째 버섯을 먹지 않았다면 그 이후에는 버섯을 먹을 수 없습니다.
Mario는 받은 점수의 합계를 가능한 한 100에 가깝게 하려고 합니다.
마리오가 버섯에 대해 얻은 점수를 출력하는 프로그램을 작성하세요.
기입
총 10줄의 각 버섯에 대해 점수가 부여됩니다. 이 값은 100 이하의 양의 정수입니다. 버섯이 나타난 순서대로 점수가 부여됩니다.
누르다
첫 번째 줄은 Mario가 얻은 포인트를 인쇄합니다. 100에 가까운 두 개의 숫자(예: 98, 102)가 있으면 Mario는 더 큰 값을 선택합니다.
코드 정답
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를 import하여 sys.stdin.readline을 사용하고 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 및 arr(cnt)에 값을 추가하고 ans = ans + arr(cnt)와 같이 말하여 ans에 할당합니다.
첫 번째 조건(if)과 마찬가지로 ans가 100이면 while문이 종료되고 ans 값이 출력됩니다.
ans가 100보다 크면 중첩된 조건문을 두 번째 조건(elif)으로 입력합니다. 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)