통장의 입출금 기록을 읽어 금액과 잔액을 보기 좋게 출력한다.
첫 줄에 거래 수 n과 처음 잔액 b가 빈칸 하나로 띄어 주어진다.
다음 n줄에 거래 금액 a가 한 줄에 하나씩 주어진다. 양수는 입금, 음수는 출금, 0은 금액이 없는 거래다.
거래마다 잔액에 a를 더하고, 그 거래의 금액과 더한 뒤의 잔액을 빈칸 하나로 띄어 한 줄에 출력한다.
수는 부호를 뗀 숫자를 오른쪽 끝에서부터 세 자리마다 쉼표(,)로 끊어 쓴다. 맨 앞에는 쉼표를 쓰지 않는다(예: 1234567 → 1,234,567, 123 → 123).
음수는 끊은 숫자 앞에 - 를 붙인다.
금액이 양수면 끊은 숫자 앞에 + 를 붙이고, 0이면 부호 없이 0이라고 쓴다.
잔액이 0 이상이면 부호를 붙이지 않는다.
입력
1 ≤ n ≤ 1000, −10^12 ≤ b ≤ 10^12, −10^9 ≤ a ≤ 10^9. 모든 수는 정수다
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
쉼표는 오른쪽 끝에서부터 세어야 해서 맨 뒤 숫자부터 앞으로 거꾸로 도는 반복이 자연스러워요(for (i = len - 1; i >= 0; i--), Python range(len(s) - 1, -1, -1), 크레이콘 반복 (i = s.길이 - 1; i >= 0; i -= 1)). 왼쪽부터 세 자리씩 끊으면 1234가 "123,4"가 돼요. 부호를 뗀 뒤 끊어야 해요. "-123456"을 통째로 끊으면 - 도 한 자리로 세어 "-,123,456"이 돼요. 잔액은 1조에 10억씩 1000번 더해 2조까지 가요. int(약 21억)로는 처음 잔액부터 담을 수 없으니 C·C++ long long, Java·C# long을 써요. Python은 정수 크기에 끝이 없고, JS·TS·크레이콘의 수는 2^53(약 9천조)까지 정수가 정확해서 그대로 돼요. 만들어 둔 서식도 있지만 언어마다 달라요. Python f"{v:,}"는 늘 쉼표를 써요. Java String.format("%,d", v)와 C# v.ToString("N0")는 컴퓨터의 지역 설정을 따라서 독일어 설정이면 1.234처럼 점이 나와요. JS·TS toLocaleString도 지역 설정을 따르니 "en-US"를 줘야 해요. C·C++에는 지역 설정과 상관없이 쉼표를 찍는 표준 서식이 없어요(C++20 std::format("{:L}", v)도 지역 설정을 따라요). 0원 거래에 + 를 붙이는 것도 흔한 실수예요.
Pythonmain.py · 26 줄
def group(v): """0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다.""" s = str(v) out = "" for i in range(len(s) - 1, -1, -1): # 맨 오른쪽 숫자부터 거꾸로 out = s[i] + out if (len(s) - i) % 3 == 0 and i > 0: # 세 개를 붙였고 앞에 숫자가 더 있으면 out = "," + out return outdef money(v, plus): if v < 0: return "-" + group(-v) # 부호는 떼고 끊은 뒤 앞에 붙인다 if v > 0 and plus: return "+" + group(v) return group(v)n, balance = map(int, input().split())lines = []for _ in range(n): a = int(input()) balance += a # 잔액에 차례로 쌓는다 lines.append(money(a, True) + " " + money(balance, False))print("\n".join(lines))
JavaScriptmain.js · 28 줄
const nums = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const n = nums[0];let balance = nums[1]; // 2조까지라 Number(2^53 미만)로 정확하다// 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다function group(v) { const s = String(v); let out = ""; for (let i = s.length - 1; i >= 0; i--) { out = s[i] + out; if ((s.length - i) % 3 === 0 && i > 0) out = "," + out; } return out;}function money(v, plus) { if (v < 0) return "-" + group(-v); // 부호는 떼고 끊은 뒤 앞에 붙인다 if (v > 0 && plus) return "+" + group(v); return group(v);}const out = [];for (let k = 0; k < n; k++) { const a = nums[2 + k]; balance += a; out.push(money(a, true) + " " + money(balance, false));}console.log(out.join("\n"));
TypeScriptmain.ts · 29 줄
import { readFileSync } from "node:fs";const nums: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const n: number = nums[0];let balance: number = nums[1]; // 2조까지라 number(2^53 미만)로 정확하다// 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다function group(v: number): string { const s: string = String(v); let out = ""; for (let i = s.length - 1; i >= 0; i--) { out = s[i] + out; if ((s.length - i) % 3 === 0 && i > 0) out = "," + out; } return out;}function money(v: number, plus: boolean): string { if (v < 0) return "-" + group(-v); // 부호는 떼고 끊은 뒤 앞에 붙인다 if (v > 0 && plus) return "+" + group(v); return group(v);}const out: string[] = [];for (let k = 0; k < n; k++) { const a: number = nums[2 + k]; balance += a; out.push(money(a, true) + " " + money(balance, false));}console.log(out.join("\n"));
JavaMain.java · 36 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { // 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다 static String group(long v) { String s = Long.toString(v); StringBuilder out = new StringBuilder(); for (int i = s.length() - 1; i >= 0; i--) { out.append(s.charAt(i)); if ((s.length() - i) % 3 == 0 && i > 0) out.append(','); } return out.reverse().toString(); // 거꾸로 붙였으니 마지막에 뒤집는다 } static String money(long v, boolean plus) { if (v < 0) return "-" + group(-v); // 부호는 떼고 끊은 뒤 앞에 붙인다 if (v > 0 && plus) return "+" + group(v); return group(v); } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] first = br.readLine().trim().split("\\s+"); int n = Integer.parseInt(first[0]); long balance = Long.parseLong(first[1]); // 1조를 넘으니 int가 아니라 long StringBuilder out = new StringBuilder(); for (int k = 0; k < n; k++) { long a = Long.parseLong(br.readLine().trim()); balance += a; out.append(money(a, true)).append(' ').append(money(balance, false)).append('\n'); } System.out.print(out); }}
C#Main.cs · 40 줄
using System;using System.Text;class Program{ // 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다 static string Group(long v) { string s = v.ToString(); var out_ = new StringBuilder(); for (int i = s.Length - 1; i >= 0; i--) { out_.Insert(0, s[i]); if ((s.Length - i) % 3 == 0 && i > 0) out_.Insert(0, ','); } return out_.ToString(); } static string Money(long v, bool plus) { if (v < 0) return "-" + Group(-v); // 부호는 떼고 끊은 뒤 앞에 붙인다 if (v > 0 && plus) return "+" + Group(v); return Group(v); } static void Main() { string[] first = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int n = int.Parse(first[0]); long balance = long.Parse(first[1]); // 1조를 넘으니 int가 아니라 long var sb = new StringBuilder(); for (int k = 0; k < n; k++) { long a = long.Parse(Console.ReadLine().Trim()); balance += a; sb.Append(Money(a, true)).Append(' ').Append(Money(balance, false)).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 30 줄
#include <iostream>#include <string>// 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다std::string group(long long v) { std::string s = std::to_string(v); std::string out; for (int i = static_cast<int>(s.size()) - 1; i >= 0; i--) { out.insert(out.begin(), s[i]); if ((static_cast<int>(s.size()) - i) % 3 == 0 && i > 0) out.insert(out.begin(), ','); } return out;}std::string money(long long v, bool plus) { if (v < 0) return "-" + group(-v); // 부호는 떼고 끊은 뒤 앞에 붙인다 if (v > 0 && plus) return "+" + group(v); return group(v);}int main() { int n; long long balance, a; // 1조를 넘으니 int가 아니라 long long std::cin >> n >> balance; for (int k = 0; k < n; k++) { std::cin >> a; balance += a; std::cout << money(a, true) << ' ' << money(balance, false) << '\n'; }}
Cmain.c · 37 줄
#include <stdio.h>/* 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊어 buf 안 어딘가에 쓰고, 그 시작을 돌려준다 */static char *group(long long v, char *buf, int size) { char *p = buf + size - 1; *p = '\0'; int count = 0; do { /* 맨 오른쪽 숫자부터 거꾸로 채운다 */ if (count > 0 && count % 3 == 0) *--p = ','; *--p = (char)('0' + v % 10); v /= 10; count++; } while (v > 0); return p;}static void money(long long v, int plus) { char buf[40]; if (v < 0) printf("-%s", group(-v, buf, sizeof buf)); /* 부호는 떼고 끊은 뒤 앞에 붙인다 */ else if (v > 0 && plus) printf("+%s", group(v, buf, sizeof buf)); else printf("%s", group(v, buf, sizeof buf));}int main(void) { int n; long long balance, a; /* 1조를 넘으니 int가 아니라 long long */ scanf("%d %lld", &n, &balance); for (int k = 0; k < n; k++) { scanf("%lld", &a); balance += a; money(a, 1); putchar(' '); money(balance, 0); putchar('\n'); } return 0;}
Craykonmain.cray · 38 줄
첫줄 = 콘솔.수들읽기();n = 첫줄[0];잔액 = 첫줄[1]; // 2조까지라 크레이콘 수로 정확하다반복 (k = 0; k < n; k += 1){ a = 콘솔.줄읽기().수로변환(); 잔액 += a; 콘솔.쓰기(돈(a, 참) + " " + 돈(잔액, 거짓));}// 0 이상인 v를 오른쪽부터 세 자리마다 쉼표로 끊는다끊기(v){ s = "" + v; 결과 = ""; 반복 (i = s.길이 - 1; i >= 0; i -= 1) { 결과 = s[i] + 결과; 만약 ((s.길이 - i) % 3 == 0 && i > 0) { 결과 = "," + 결과; } } 돌려주기 결과;}돈(v, 더하기표){ 만약 (v < 0) { 돌려주기 "-" + 끊기(-v); // 부호는 떼고 끊은 뒤 앞에 붙인다 } 만약 (v > 0 && 더하기표) { 돌려주기 "+" + 끊기(v); } 돌려주기 끊기(v);}