{ }codelper
덧셈P0222

덧셈 숙제 채점하기

동생이 덧셈 숙제를 했다.
식마다 맞았는지 채점하고, 틀린 답은 고쳐 주려고 한다. 첫 줄에 식의 수 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
출력
n줄의 채점 결과, 마지막 줄에 틀린 식의 수
예시 1 · stdin
3
3 + 4 = 7
12 + 5 = 125
-8 + 3 = -11
stdout
O 3 + 4 = 7
X 12 + 5 = 17
X -8 + 3 = -5
2
예시 2 · stdin
2
1500000000 + 1500000000 = 3000000000
1500000000 + 1500000000 = -1294967296
stdout
O 1500000000 + 1500000000 = 3000000000
X 1500000000 + 1500000000 = 3000000000
1
main.py
입력(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);