[BOJ/C++] 15552 빠른 A+B

햅쌀이·2023년 5월 2일
1

✍🏻 Algorithm

목록 보기
8/22
post-thumbnail

문제 링크 https://www.acmicpc.net/problem/15552

📝 문제

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

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

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

💻 코드

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int N;
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        int A, B;
        cin >> A >> B;
        cout << A + B << "\n";
    }
    
    return 0;
}

📌 해결방법

  1. 문제에 나와있는 방법대로 문제를 풀어야 시간초과가 안남!

💡 배운 점

- ios::sync_with_stdio(false)

  • C와 C++ 표준 stream의 동기화를 비활성화함
  • 이 코드를 작성한 후에는 C 스타일과 C++ 스타일의 혼합이 불가
    (printf scanf와 cin, cout 혼합 사용 불가)
  • C++ 코드만 사용해 기존 동기화 과정에서 필요하던 시간 절약
    → 입출력 속도 향상

- cin.tie(0)

  • 한 쌍으로 묶여있는 cin, cout을 분리
cout << "이름 입력해주세요. \n" <<;
cin >> name;

원래대로라면 이름을 입력해주세요. 가 무조건 먼저 출력된 후 이름 입력 가능
  • cin.tie(0) 코드를 추가하면 출력전에 이름 입력 가능
    내부적으로 cin, cout 묶는 과정 수행하지않아 시간 절약

- \n

  • 입출력시 개행을 하려면 endl 대신 \n을 사용해야 시간 절약

✔ 느낀 점

그냥 빠른 입출력을 위해 아무 생각없이 코드를 추가했었는데, 이번에 정리하면서 코드가 어떻게 작동되고, 왜 시간을 절약할 수 있는지 이해하게 되어 더 오랫동안 기억에 남을 것 같다!!🤩

profile
C++과 파이썬 공부중

2개의 댓글

comment-user-thumbnail
2023년 5월 2일

혹시 100m 몇초에 뛰시나요??

1개의 답글