입출력의 기본 빠른 A+B를 풀어보자

15552 빠른 A+B

위 문제는 단계별 문제 중 입출력 문제에 해당하는 문제이다. 이번 문제는 어려운 문제는 아니다. 다만, baekjoon문제를 풀고자 할 때 입출력 팁을 정리하기 위해서 포스팅한다.

현재 업무에서 C++을 언어를 주 언어로 하다보니, C++로 모든 것을 연습하고자한다. 따라서 이번 문제도 C++를 보고 풀었으나, 다른 사람들이 푼 소스코드를 보거나, 지식이 부족한 부분에 대해 추가적으로 정리하고자 한다.

문제

빠른 A+B 해당 문제는 A+B연산을 통해 출력하는 문제이다. 단순해보이지만, 데이터가 1,000,000개가 들어오게 된다. 이럴 경우 memory가 터지거나, 시간초과가 날 수 있다.

문제에서 입력은 아래와 같이 주어진다. 빠른 A+B 입력

문제 풀이

해당 문제는 친절하게 어떻게 풀면 좋은지 주어진다.


본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.


문제에서는 그냥 A+B를 할경우 시간초과가 발생한다고 한다. 어떻게 풀어라고 지시한다. 정말 이렇게 풀면 통과과 될까 하고 코드를 작성해 제출해보았다. 정말된다.

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
  cin.tie(NULL);
  cout.tie(NULL);
  ios_base::sync_with_stdio(false);

  int a,b,c;
  cin >> a;
  for (int i = 0; i < a; i++){
    cin >> b >> c;
    cout << b+c << "\n";
  }
}

위의 코드를 이용해 풀면 쉽게 풀린다. 하지만 이게 문제가 아니다. 문제의 힌트로 주어진 아래의 코드는 뭔가?

  cin.tie(NULL);
  cout.tie(NULL);
  ios_base::sync_with_stdio(false);

이 부분에 대해 알아보자. 추가적인 설명을 요하니 여기 를 클릭해서 보자.