[핵심암기]

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;
}

 

[참고자료]

연습을 위해 아래 두 글을 상세하게 참고하였습니다.

https://st-lab.tistory.com/200

https://dingcoding.tistory.com/62

+ Recent posts