[핵심암기]
1. c++코드 짤 때 효율적인 기본 세팅은 다음과 같습니다. #iostream #namespace #"\n"
#include <iostream>
using namespace std; // namespace 한 번에 가져오는 tip
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
std::cout << "Hello, World!" << "\n";
return 0;
}
1. C++ 3가지 입출력 정리
C++에는 기본적으로 3가지 입출력 방식이 있습니다.
3번 cstdio > 2번 stdio.h > 1번 iostream 순서로 메모리 성능이 더 좋습니다.
1.iostream : C++의 표준 입출력 헤더파일 입니다. 대표적으로 cin, cout이 있습니다.
iostream도 입출력을 빠르게 할 수 있는 방법이 있긴 합니다. 나중에 공부해보세요.
#include <iostream>
main() {
int a;
std::cin >> a;
std::cout <<a;
}
2.stdio.h : C++은 기본적으로 C의 확장버전입니다. 즉, C의 표준 라이브러리를 사용할 수 있기 때문에 C의 표준 라이브러리 헤더 파일들을 include하여 해당 함수들을 사용할 수 있습니다.
#include <stdio.h>
main() {
int a;
scanf("%d", &a);
printf("%d", a);
}
3.cstdio : stdion.h와 크게 다를 것은 없습니다. C언어에서는 namespace 개념이 없지만, c++에서는 namespace를 지원하면서 C언어의 표준 라이브러리를 namespace안에서도 사용할 수 있도록 한 것입니다. 함수 기능상에서는 차이가 없습니다.
#include <cstdio>
main() {
int a;
scanf("%d", &a); // std::scanf도 가능
printf("%d", a); // std;:printf도 가능
}
2. [백준 C++] 2557번 : Hello World
위에서 배운 3가지 방법으로 문제를 풀어보겠습니다.
1.iosream
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
2.stdio.h
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
3.cstdio
#include <cstdio>
int main() {
printf("Hello World!");
return 0;
}
3. C++ 입출력 속도 해결
시간초과 방지를 위해서 아래 두 줄을 추가해주는 것이 좋습니다.
ios::sync_with_stdio(false);
cin.tie(0);
기존 입출력을 cin, cout, printf, scanf 함수를 이용했다가,
위의 두 줄을 추가하고 cin, cout만 사용하면 입출력 속도가 빨라집니다.
3-1. ios::sync_with_stdio(false)
이 코드는 C와 C++ 표준 stream의 동기화를 비활성화합니다.
동기화가 활성화 되어있다는 것의 의미는, C 스타일과 C++ 스타일의 입출력을 혼합해도 문제가 없습니다.
예를 들어 C스타일(printf, scanf)과 C++스타일(cin cout)을 혼합하여 사용해도 문제가 없습니다.
하지만 위의 코드를 추가하게 되면, 두 스타일 혼합은 할 수 없지만,
C++ 스타일 코드만 사용하면, 기존 동기화 과정에서 필요하던 시간이 절약되어 입출력 속도가 빨라집니다.
다만, 이 코드를 사용하면 기존 C의 표준 입출력인 scanf, printf, getchar 함수 사용시 오류가 납니다.
따라서 C++의 입출력인 cin, cout만 사용하도록 주의해야합니다.
3-2. cin.tie(0);
cin.tie는 평소 cin과 cout을 묶어줍니다.
예를 들어서 아래와 같은 코드가 있다고 생각해봅시다.
cout << "이름을 입력하세요" <<;
cin >> name;
평소에는 cin과 cout이 묶어져 있으므로,
반드시 "이름을 입력하세요"가 출력된 후 이름을 입력할 수 있습니다.
하지만 cin.tie(0) 혹은 cin.tie(null) 코드를 추가해주면,
"이름을 입력하세요"가 출력되기 전에 이름을 입력할 수 있습니다.
평소에는 이름을 묻기도 전에 이름을 입력할 수 있는 어색한 상황이 펼쳐지겠지만,
알고리즘 문제를 풀 때는 상관없기 때문에 이 코드를 많이 사용합니다.
일반적으로는 scanf printf가 cin cout보다 빠릅니다.
하지만 위에서 다룬 2줄의 코드를 추가하고, 두 줄을 입력한 뒤 프로그래밍 하는 것이 좋습니다.
3-3. 사용 시 주의할 점
두 호출은 성능과는 아무 관련 없는 다른 의미를 가집니다.
웬만하면 알고리즘 문제 풀 때만 시간 절약을 위해 사용합시다.
모든 프로그램에 입출력 시간을 절약하기 위해 사용하는 것은 잘못된 방법입니다.
4. 입출력 시 시간 절약을 위하여
입출력시 개행할 때, endl 대신 '\n'을 사용해야 시간 절약을 할 수 있습니다.
둘 다 개행 문자라는 점에서 차이는 없습니다.
하지만 endl은 버퍼를 비우고 즉시 ans 부분을 출력합니다. 버퍼를 지우는 과정 때문에 속도가 더 느립니다.
"\n"은 단순히 개행만 해주고, 버퍼를 비우는 역할은 없습니다.
1) endl
std::cout<<ans<<std::endl;
2) "\n"
std::cout<<ans<<'\n';
5. 입출력 절약한 백준 2557번 나의 최종 코드
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout << "Hello World!" <<"\n";
return 0;
}
[참고자료]
연습을 위해 아래 두 글을 상세하게 참고하였습니다.
'코딩테스트 준비 > C++' 카테고리의 다른 글
[백준 c++] 11062 카드게임 (1) | 2024.08.09 |
---|---|
[백준 c++] 7579 앱 (0) | 2024.08.09 |
[C++] 다익스트라 알고리즘 (0) | 2024.08.06 |
[백준 C++] 1000번 : A+B | C++ 숫자 입력 받기, C++ Python 시간 비교 (0) | 2024.08.06 |