T'SPACE

다채로운 에디터들의 이야기

컴퓨터공학/알고리즘

C++, C 언어 알고리즘 표준 입출력

Tonny Kang 2024. 3. 1. 08:29
반응형

 C++ 입출력 최적화: sync_with_stdio와 cin.tie 이해하기

코딩테스트에서 표준 입출력을 사용할 때 주로 scanf/printf 또는 cin/cout을 사용합니다. 

C++에서는 string과 같은 편의 기능을 제공하는 cin/cout을 주로 사용하게 됩니다. 

그러나 주의해야 할 점은 cin/cout을 사용할 때 시간초과를 막기 위해 특별한 조치가 필요하다는 점입니다.



 1. ios::sync_with_stdio(0)과 cin.tie(0)

C++에서는 입출력 버퍼를 동기화하는 작업이 기본적으로 수행됩니다. 

그러나 이 작업은 입출력의 양이 많을 때 시간을 소비할 수 있습니다. 따라서, 입출력 작업이 많은 경우에는 이 동기화 작업을 해제하는 것이 좋습니다. 

동기화 작업 해제를 위해 아래의 두 명령을 실행합니다:

```cpp
ios::sync_with_stdio(0);
cin.tie(0);
```



- `ios::sync_with_stdio(0)`: C++ stream과 C stream을 동기화하는 작업을 해제합니다.

여기서 보통 프로그램에서 cout 과 printf를 코드 내에서 섞어서 사용하는 경우에

출력 순서등이 꼬이지 않게 동기화 해주는데

코딩을 하는데 출력으로 보통 cout하나 아니면 printf 둘 중 하나만 사용하기 떄문에
얘를 동기화하면 출력이 매우 느려진다..

그래서 이 동기화를 풀어주는게 이 코드이다


- `cin.tie(0)`: 출력 버퍼를 비워주는 작업을 하지 않도록 설정합니다.

보통 값을 입력 받고 그 값을 계산하거나 조치를 취해 출력이되는데

코딩테스트의 경우 출력 값만 제대로 나오는지 확인하기에

버퍼를 비워줄 필요가 없다 매번

그래서 그 필요 없는 과정을 없에주는 이 코드가 그 역할을 한다

2. cin/cout과 printf/scanf의 혼용

동기화 작업을 해제하면서도 주의해야 할 점은 

`cin/cout`과 `printf/scanf`를 혼용하지 않는 것입니다. 혼용할 경우 출력 결과의 순서가 꼬일 수 있습니다. 따라서 한 가지 스타일을 선택하여 일관되게 사용해야 합니다.



3. endl 대신 개행문자 사용하기

앞서 `cin.tie(0)`에 대해 말씀드린것 처럼

`endl`은 개행문자(`"\n"`)를 출력하고 출력 버퍼를 비우는 명령입니다. 그러나 프로그램이 종료될 때 출력이 채점되기 때문에 중간에 출력 버퍼를 비우는 작업은 필요하지 않습니다.

따라서, 줄바꿈이 필요한 경우에는 `endl` 대신에 개행문자를 직접 출력하는 것이 좋습니다.

예시:

```cpp
std::cout << "Hello, world!\n";
```



`endl`을 사용하지 않고 개행문자를 직접 출력하여 코드를 간결하고 효율적으로 만들 수 있습니다.


반응형