확인한 환경과 범위

Windows · Python 3.12.4. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.

이 글의 순서 5개 단락

하루 예산과 지출 금액을 입력받아 얼마나 썼고 얼마가 남았는지 계산해 봅시다. 지출을 입력할 때 글자나 음수를 잘못 넣어도 다시 입력할 수 있도록 만들겠습니다. 이 예제는 Python 3.12에서 표준 입력을 사용하며, 금액은 원 단위의 정수로 다룹니다.

입력을 확인하고 지출을 모으기

프로그램은 예산, 지출 항목 수, 각 항목의 금액을 차례로 받습니다. 세 종류의 입력 모두 0 이상의 정수여야 합니다. input이 받은 문자열을 int로 변환하고, 변환할 수 없거나 음수라면 안내한 뒤 같은 값을 다시 요청합니다.

while True는 조건이 항상 참인 반복문입니다. 여기서는 유효한 값이 들어올 때까지 입력을 반복하고, 함수의 return으로 유효한 값을 돌려주면서 반복도 끝냅니다. 입력 검증을 한 함수에 모으면 예산과 항목 수, 각 금액에 같은 기준을 적용할 수 있습니다.

def read_nonnegative_integer(prompt):
    while True:
        try:
            value = int(input(prompt))
        except ValueError:
            print("0 이상의 정수를 입력하세요.")
        else:
            if value >= 0:
                return value
            print("0 이상의 정수를 입력하세요.")


def print_summary(budget, expenses):
    total = 0
    for expense in expenses:
        total += expense
    remaining = budget - total
    print(f"총 지출: {total}원")
    print(f"남은 예산: {remaining}원")
    print(f"지출 항목 수: {len(expenses)}개")


budget = read_nonnegative_integer("예산: ")
count = read_nonnegative_integer("지출 항목 수: ")
expenses = []

for index in range(count):
    expense = read_nonnegative_integer(f"{index + 1}번 지출: ")
    expenses.append(expense)

print_summary(budget, expenses)

종합 프로젝트: 하루 지출 요약기 — 첫 예제의 실제 실행 결과

입력과 예상 결과

다음 순서로 입력한다고 가정합니다. 각 줄은 입력을 요청할 때 입력할 값 하나입니다.

10000
2
3000
4500

대화형 화면의 예상 모습은 다음과 같습니다. 안내 문구 뒤의 숫자는 사용자가 입력한 값입니다.

예산: 10000
지출 항목 수: 2
1번 지출: 3000
2번 지출: 4500
총 지출: 7500원
남은 예산: 2500원
지출 항목 수: 2개

3000과 4500이 리스트에 들어가고, 이를 더한 총 지출은 7500원입니다. 예산 10000원에서 총액을 빼면 2500원이 남습니다.

잘못된 입력이 있을 때도 살펴봅시다. 다음은 예산에 글자, 첫 번째 지출에 음수를 넣은 뒤 각각 올바른 값을 다시 입력하는 경우의 예상 모습입니다.

예산: 안녕
0 이상의 정수를 입력하세요.
예산: 5000
지출 항목 수: 1
1번 지출: -200
0 이상의 정수를 입력하세요.
1번 지출: 6000
총 지출: 6000원
남은 예산: -1000원
지출 항목 수: 1개

코드의 흐름과 경계 조건

int(input(prompt))에서 정수로 변환할 수 없는 값이 들어오면 ValueError가 발생하고 except의 안내가 출력됩니다. 새로 사용한 try의 else는 try 안에서 예외가 발생하지 않았을 때 실행됩니다. 변환에 성공한 값이 음수이면 return하지 않고 안내하므로, 다음 반복에서 같은 입력을 다시 요청합니다.

입력한 항목 수만큼 for문이 반복되고, 유효한 금액만 append로 리스트에 추가됩니다. range(count)는 0부터 시작하므로 화면에 표시할 순서에는 index + 1을 사용합니다. print_summary는 리스트의 금액을 하나씩 더합니다. total += expense는 앞에서 쓴 total = total + expense를 짧게 적은 형태로, 기존 합계에 현재 금액을 더해 다시 저장합니다. len(expenses)로 저장된 항목 수를 구합니다. len은 리스트에 들어 있는 항목의 개수를 돌려주는 내장 함수입니다.

주의할 점은 다음과 같습니다.

  • 3.5, 빈 입력, 1000원은 int로 변환할 수 없어 다시 입력해야 합니다. 0은 유효합니다.
  • 항목 수가 0이면 지출 입력을 건너뜁니다. 빈 리스트의 총액은 0이고, 남은 예산은 입력한 예산과 같습니다.
  • 지출이 예산보다 크면 남은 예산이 음수로 출력됩니다. 예산을 얼마나 초과했는지 그 값으로 확인할 수 있습니다.
  • 항목 수만큼 유효한 금액을 받습니다. 잘못된 값은 리스트에 추가되지 않으며 해당 항목을 다시 입력합니다.
  • 입력이 중간에 끝나는 경우 발생하는 EOFError는 이 예제에서 처리하지 않습니다.

연습: 예산 초과 안내하기

print_summary에서 세 줄의 요약을 출력한 뒤, 남은 예산이 음수일 때만 예산을 초과했습니다.를 출력해 보세요. 예산이 총 지출과 같을 때는 안내하지 않아야 합니다.

풀이

print_summary의 마지막 print 아래에 같은 함수 들여쓰기로 다음을 추가합니다.

    if remaining < 0:
        print("예산을 초과했습니다.")

예산이 5000원이고 총 지출이 6000원이면 remaining은 -1000이므로 안내가 출력됩니다. 남은 예산이 0이면 조건이 거짓이므로 안내하지 않습니다.

참고 자료

CHECK THE SOURCE

참고한 공식 문서

기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.

한 줄씩 이해하고, 차곡차곡 기록합니다.이 글의 오류 제보하기 ↗