(초록색 글자 클릭 시 문제로 이동)
시간 초과 나지 않게, 테스트케이스 개수에 맞춰 빠르게 A+B출력하게
기존 A+B 문제에서 성능에 더 중심을 둔 문제이다.
문제에서 준 힌트를 무시하고 한번 해보았다.
앞서 푼 문제와 같은 형식으로 풀면 된다.
테스트 케이스 t를 입력 받는다.
t만큼 반복하여 a와 b를 입력받고 그 합을 출력하는 for문을 작성한다.
#include <iostream>
using namespace std;
int main()
{
int t, i, a, b;
cin >> t;
for (i = 0; i < t; i++) {
cin >> a >> b;
cout << a + b << "\n";
}
return 0;
}
⬇⬇ 이대로 작성하면 결과는 다음과 같다 ⬇⬇
(여기서cin.tie(NULL)과 sync_with_stdio(false)를 사용하는 이유 등 자세한 설명은 Stranger's LAB님의 티스토리에서 설명을 잘 해놔서, 이 게시물에 적힌 글을 요약하여 적었다.
백준 사이트에는 다음과 같이 나와있다.
cin.tie(NULL)
과sync_with_stdio(false)
를 둘 다 적용해 주고,endl
대신\n
를 쓰자
C언어, C++의 경우 scanf()
, printf()
를 사용한다. 이 경우 입출력 자체가 매우 빨라 쉽게 통과한다. 그러나 C++의 standard 입출력 cin, cout을 사용하면 시간 초과가 난다. C++ 뿐 아니라 JAVA, Python도 마찬가지이다. (Python의 경우 원래 극도로 느리다.)
이 문제를 푸는 첫번째 방법은 C표준 입출력 stdio.h를 쓰는 것이다.
stdio.h로 풀면 간단하게 해결된다.
나는 iostream으로 풀어보고자 한다.
iostream으로 cin, cout만 쓰면 💡1번째 시도💡와 같이 시간초과가 뜬다.
stdio.h와 다르게 왜 느릴까?!
🔒1. 이유🔒
🔑2. 해결🔑 : "동기화를 끊어주면 된다!"
알고리즘 문제 풀이는 두 동기화를 끊어주어도 OK
동기화를 끊으면 => C++표준 스트림이 독립적으로 IO 버퍼링
이를 위해 ios_base
에 있는 sync_with_stdio()
를 활용! (파라미터는 false
를 해줄 때 동기화 해제)
단, 동기화를 해제 했기때문에 C와 C++ 스타일 중 하나를 선택해서 써야 함!
cin.tie(NULL);
ios_base::sync_with_stdio(false);
#include <iostream>
using namespace std;
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int t, i, a, b;
cin >> t;
for (i = 0; i < t; i++) {
cin >> a >> b;
cout << a + b << "\n";
}
return 0;
}
이렇게 하면 성공!!
cin.tie(NULL);
와 ios_base::sync_with_stdio(false);
를 몰라서 이 개념을 이해하기 위해 여러 참고 사이트를 이용했다. 그래서 이해하는데 시간이 오래걸렸다. 가장 이해가 잘 되었던 두 사이트를 아래 Reference에 첨부했다.
내가 모르는 개념을 계속 알아가고 싶다. 주춤하기 보다는 계속 채워가고 싶은 마음이다.