동생이 덧셈 숙제를 했다. 식마다 맞았는지 채점하고, 틀린 답은 고쳐 주려고 한다.
첫 줄에 식의 수 n이 주어진다.
다음 n줄에 동생이 쓴 식이 "a + b = c" 꼴로 한 줄에 하나씩 주어진다.
a, b, c는 정수이고, 수와 기호 사이에는 빈칸이 하나씩 있다.
음수는 앞에 -를 붙여 쓴다(예: -8 + 3 = -5).
수는 쉼표 없이 숫자만으로 쓰고, 앞에 0이나 +를 붙이지 않는다. 0은 -0으로 쓰지 않는다.
식마다 한 줄에 채점 결과를 출력하라.
c가 a + b와 같으면 "O a + b = c"를 출력한다.
c가 a + b와 다르면 "X a + b = s"를 출력한다. 여기서 s는 a + b의 올바른 값이다.
출력하는 수도 입력처럼 쉼표 없이 숫자만으로 쓴다.
마지막 줄에 틀린 식의 수를 출력하라.
입력
1 ≤ n ≤ 1,000, -1,500,000,000 ≤ a, b ≤ 1,500,000,000, -3,000,000,000 ≤ c ≤ 3,000,000,000
O 1500000000 + 1500000000 = 3000000000
X 1500000000 + 1500000000 = 3000000000
1
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
+ 하나가 덧셈도 하고 문자열 이어 붙이기도 하는 게 첫째 함정이에요. JS·TS에서 split(" ")으로 나눈 조각은 문자열이라 Number로 바꾸지 않으면 "3" + "4"가 "34"가 되고, 동생이 쓴 틀린 답 34를 맞았다고 채점해요(TS는 number[]로 적어 두면 타입 검사가 알려 줘요). 크레이콘도 수로변환() 없이 더하면 똑같이 이어 붙어요. Python은 "3" + "4"도 "34"지만, 문자열과 수를 더하면 오류를 내 줘요. Java·C#·JS는 문자열을 만나면 그 뒤를 왼쪽부터 이어 붙여서 "= " + a + b가 = 34가 돼요. 합은 s = a + b로 먼저 구하거나 (a + b)처럼 괄호로 묶어요. 둘째 함정은 크기예요. a와 b가 15억까지라 합은 30억까지 가는데, C·C++·Java·C#의 int는 약 21억까지라 넘쳐요. C#과 Java는 넘쳐도 오류 없이 음수가 되고(C#은 checked로 감싸야 알려 줘요), C·C++의 부호 있는 정수 넘침은 정의되지 않은 동작이에요. 그래서 C long long과 scanf("%lld + %lld = %lld"), C++ long long, Java·C# long으로 받아요. Python 정수는 크기 제한이 없고, JS·TS·크레이콘의 수는 2^53까지 정확해서 30억은 문제없어요.
Pythonmain.py · 14 줄
n = int(input())out = []wrong = 0for _ in range(n): a, plus, b, eq, c = input().split() a, b, c = int(a), int(b), int(c) # 문자열끼리 +하면 이어 붙는다("3" + "4" → "34") s = a + b if s == c: out.append(f"O {a} + {b} = {s}") else: out.append(f"X {a} + {b} = {s}") wrong += 1out.append(str(wrong))print("\n".join(out))
JavaScriptmain.js · 17 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out = [];let wrong = 0;for (let i = 1; i <= n; i++) { // 빈칸으로 나눈 조각은 문자열이라 Number로 바꿔야 +가 덧셈이 된다 const [a, , b, , c] = lines[i].trim().split(" ").map(Number); const s = a + b; if (s === c) { out.push(`O ${a} + ${b} = ${s}`); } else { out.push(`X ${a} + ${b} = ${s}`); wrong++; }}out.push(String(wrong));console.log(out.join("\n"));
TypeScriptmain.ts · 18 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const out: string[] = [];let wrong = 0;for (let i = 1; i <= n; i++) { // 빈칸으로 나눈 조각은 문자열이라 Number로 바꿔야 +가 덧셈이 된다 const [a, , b, , c]: number[] = lines[i].trim().split(" ").map(Number); const s: number = a + b; if (s === c) { out.push(`O ${a} + ${b} = ${s}`); } else { out.push(`X ${a} + ${b} = ${s}`); wrong++; }}out.push(String(wrong));console.log(out.join("\n"));
JavaMain.java · 29 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); StringBuilder out = new StringBuilder(); int wrong = 0; for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); // 합이 30억까지 가니 int(약 21억)가 아니라 long으로 받는다 long a = Long.parseLong(p[0]); long b = Long.parseLong(p[2]); long c = Long.parseLong(p[4]); long s = a + b; char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } // 문자열 뒤에서 + a + b를 쓰면 이어 붙으니 합은 s로 따로 구해 둔다 out.append(mark).append(' ').append(a).append(" + ").append(b).append(" = ").append(s).append('\n'); } out.append(wrong).append('\n'); System.out.print(out); }}
C#Main.cs · 30 줄
using System;using System.Text;class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); var sb = new StringBuilder(); int wrong = 0; for (int i = 0; i < n; i++) { string[] p = Console.ReadLine().Trim().Split(' '); // 합이 30억까지 가니 int가 아니라 long으로 받는다 long a = long.Parse(p[0]); long b = long.Parse(p[2]); long c = long.Parse(p[4]); long s = a + b; char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } sb.Append($"{mark} {a} + {b} = {s}\n"); } sb.Append(wrong).Append('\n'); Console.Write(sb); }}
C++main.cpp · 20 줄
#include <iostream>int main() { std::ios::sync_with_stdio(false); int n, wrong = 0; std::cin >> n; for (int i = 0; i < n; i++) { long long a, b, c; char plus, eq; std::cin >> a >> plus >> b >> eq >> c; long long s = a + b; // int로 더하면 30억에서 넘친다 char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } std::cout << mark << ' ' << a << " + " << b << " = " << s << "\n"; } std::cout << wrong << "\n";}
Cmain.c · 20 줄
#include <stdio.h>int main(void) { int n, wrong = 0; long long a, b, c; scanf("%d", &n); for (int i = 0; i < n; i++) { /* 형식 문자열의 " + "와 " = "가 기호를 건너뛰어 준다 */ scanf("%lld + %lld = %lld", &a, &b, &c); long long s = a + b; /* int로 더하면 30억에서 넘친다 */ char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } printf("%c %lld + %lld = %lld\n", mark, a, b, s); } printf("%d\n", wrong); return 0;}
Craykonmain.cray · 19 줄
n = 콘솔.줄읽기().수로변환();wrong = 0;반복 (i = 0; i < n; i++){ p = 콘솔.줄읽기().공백제거().나누기(" "); // 나눈 조각은 문자열이라 수로변환해야 +가 덧셈이 된다 a = p[0].수로변환(); b = p[2].수로변환(); c = p[4].수로변환(); s = a + b; mark = "O"; 만약 (s != c) { mark = "X"; wrong++; } 콘솔.쓰기(mark + " " + a + " + " + b + " = " + s);}콘솔.쓰기(wrong);