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`을 사용하지 않고 개행문자를 직접 출력하여 코드를 간결하고 효율적으로 만들 수 있습니다.
'컴퓨터공학 > 알고리즘' 카테고리의 다른 글
[백준,C++] 18110번 : solved.ac / 사사오입과 오사오입이란? (87) | 2024.03.03 |
---|---|
Strassen Algorithm (스트라센 알고리즘) 행렬의 곱 (57) | 2024.03.02 |
[백준/C++] 1541: 잃어버린 괄호 (55) | 2024.02.27 |
[백준,C++] 1463번: 1로 만들기 (58) | 2024.02.26 |
[백준,C++] 1107 : 리모컨 (49) | 2024.02.20 |