{ }codelper
끝 표시까지 반복누적 계산P0051

0이 나올 때까지 누적 합

한 줄에 정수가 하나씩 주어지고, 0이 나오면 입력이 끝났다는 표시다.
0 앞의 수를 차례로 더해 가며, 수를 하나 더할 때마다 그때까지의 합을 한 줄에 출력하라.
0 자체는 더하지 않고 출력도 하지 않는다.
0 뒤에 줄이 더 있을 수 있는데, 모두 무시한다.
0 앞에는 수가 적어도 하나 있다.
중간 합이 0이 되어도 끝이 아니다.

입력
0 앞의 수는 1개 이상 10,000개 이하, 각 수는 -1,000,000,000 이상 1,000,000,000 이하이고 0이 아니다.
0 뒤의 줄 수는 정해지지 않았다.
출력
0 앞의 수 개수만큼의 줄, 각 줄에 그때까지의 합
예시 1 · stdin
3
-5
10
0
stdout
3
-2
8
예시 2 · stdin
4
-4
7
0
100
0
stdout
4
0
7
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

끝 표시(센티널)까지 읽는 반복은 '읽고 → 0인지 묻고 → 처리' 순서예요.
읽기와 검사를 한 줄로: Python while (x := int(input())) != 0:(3.8의 바다코끼리 연산자), C while (scanf("%lld", &x) == 1 && x != 0), C++ while (std::cin >> x && x != 0), Java·C# while ((x = …parse(readLine())) != 0).
JS·TS는 입력을 한꺼번에 읽으니 for … of에서 0을 만나면 break.
크레이콘은 대입을 식 안에 쓸 수 없어서 반복 앞에서 한 번 읽고, 반복 끝에서 다음 줄을 다시 읽어요(x = 콘솔.줄읽기().수로변환();).
함정 셋: ① 입력 끝(EOF)까지 읽으면 0 뒤의 줄까지 더해져요(두 번째 예시).
② 처리한 다음에 0을 물으면 0일 때의 합이 한 줄 더 찍혀요.
③ 합이 최대 10^9 × 10^4 = 10^13이라 C·C++·Java·C#은 long(long long)이어야 해요.
Python 정수는 넘치지 않고, JS·TS·크레이콘의 실수는 2^53(약 9×10^15)까지 정확해서 괜찮아요.

Pythonmain.py · 5 줄
total = 0# 0이 끝 표시다. 0 뒤에 줄이 더 있어도 읽지 않는다while (x := int(input())) != 0:    total += x    print(total)
JavaScriptmain.js · 9 줄
const nums = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];let total = 0;for (const x of nums) {  if (x === 0) break; // 끝 표시. 뒤에 남은 수는 무시  total += x;  out.push(total);}console.log(out.join("\n"));
TypeScriptmain.ts · 10 줄
import { readFileSync } from "node:fs";const nums: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];let total = 0;for (const x of nums) {  if (x === 0) break; // 끝 표시. 뒤에 남은 수는 무시  total += x;  out.push(total);}console.log(out.join("\n"));
JavaMain.java · 17 줄
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        StringBuilder out = new StringBuilder();        long total = 0; // 10^9 × 10^4 = 10^13 이라 int로는 넘친다        long x;        // 0이 끝 표시다. 0 뒤의 줄은 읽지 않는다        while ((x = Long.parseLong(br.readLine().trim())) != 0) {            total += x;            out.append(total).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 19 줄
using System;using System.Text; class Program{    static void Main()    {        var out_ = new StringBuilder();        long total = 0; // 10^9 × 10^4 = 10^13 이라 int로는 넘친다        long x;        // 0이 끝 표시다. 0 뒤의 줄은 읽지 않는다        while ((x = long.Parse(Console.ReadLine())) != 0)        {            total += x;            out_.Append(total).Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 12 줄
#include <iostream> int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(nullptr);    long long x, total = 0; // 10^9 × 10^4 = 10^13 이라 int로는 넘친다    // 0이 끝 표시다. 0 뒤의 줄은 읽지 않는다    while (std::cin >> x && x != 0) {        total += x;        std::cout << total << '\n';    }}
Cmain.c · 11 줄
#include <stdio.h> int main(void) {    long long x, total = 0; /* 10^9 × 10^4 = 10^13 이라 int로는 넘친다 */    /* 0이 끝 표시다. 0 뒤의 줄은 읽지 않는다 */    while (scanf("%lld", &x) == 1 && x != 0) {        total += x;        printf("%lld\n", total);    }    return 0;}
Craykonmain.cray · 9 줄
합 = 0;x = 콘솔.줄읽기().수로변환();// 0이 끝 표시다. 0 뒤의 줄은 읽지 않는다동안 (x != 0){    합 += x;    콘솔.쓰기(합);    x = 콘솔.줄읽기().수로변환();}