본문 바로가기
개발공부/C++

ios_base::sync_with_stdio(0); cin.tie(0); 이게 뭐야?

by park_hama 2024. 11. 20.

### `ios_base::sync_with_stdio(0);`와 `cin.tie(0);`의 의미

이 두 줄은 **C++에서 입력과 출력 속도를 최적화**하기 위해 자주 사용되는 코드입니다. 특히, 많은 입력과 출력을 처리해야 하는 경우 성능을 크게 향상시킬 수 있습니다.

---

### 1. **`ios_base::sync_with_stdio(0);`**

- **기본 동작**  
  C++의 `cin`과 `cout`은 C의 `scanf`와 `printf`와 동기화되어 동작합니다. 이는 두 입력/출력 방식을 함께 사용했을 때 데이터의 순서를 보장하지만, 성능이 떨어질 수 있습니다.

- **역할**  
  `ios_base::sync_with_stdio(0);`는 이 동기화를 끊어 C++의 입출력(`cin`, `cout`) 속도를 C 표준 입출력(`scanf`, `printf`)과 비슷한 수준으로 빠르게 만듭니다.

- **주의점**  
  - `ios_base::sync_with_stdio(0);`를 사용하면 `cin`과 `printf` 같은 C++과 C 표준 입출력을 **섞어서 사용하면 안 됩니다**. 순서가 보장되지 않을 수 있습니다.
  
---

### 2. **`cin.tie(0);`**

- **기본 동작**  
  C++에서 기본적으로 `cin`과 `cout`은 연결되어 있어서, `cin`을 호출하기 전에 `cout`이 자동으로 플러시(flush)됩니다.  
  예를 들어, 다음과 같은 코드에서는:
  ```cpp
  cout << "Enter number: ";
  cin >> x;
  ```
  `"Enter number: "`가 출력된 후에 입력이 진행됩니다.

- **역할**  
  `cin.tie(0);`는 `cin`과 `cout`의 연결을 끊어, `cin`을 호출할 때 `cout`이 자동으로 플러시되는 동작을 비활성화합니다. 이로써 불필요한 플러시를 방지해 성능을 향상시킬 수 있습니다.

- **주의점**  
  - 출력을 명시적으로 플러시해야 할 경우에는 `cout << flush;` 또는 `endl`을 사용해야 합니다.

---

### 코드에서 사용하는 이유

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

위 코드는 다음과 같은 상황에서 사용됩니다:

1. **많은 입출력이 필요한 문제**  
   - 백준, 프로그래머스 같은 온라인 저지에서 자주 사용됩니다.
   - 예를 들어, 수백만 건 이상의 데이터를 처리해야 할 때 성능 개선 효과가 큽니다.

2. **C++의 `cin`, `cout`만 사용하는 경우**  
   - C 스타일의 `scanf`, `printf`를 사용하지 않을 때 적합합니다.

3. **출력 순서가 중요하지 않은 경우**  
   - 자동 플러시를 비활성화하므로 출력 순서를 수동으로 관리해야 합니다.

---

### 사용 시 주의할 점

- **C와 C++ 입출력을 섞어 사용하지 않기**
  ```cpp
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  // 잘못된 사용
  cin >> x;       // C++ 입력
  printf("%d\n", x); // C 출력
  ```

- **수동 플러시 필요성**
  ```cpp
  cout << "Output without flush";
  cin >> x;  // 이 시점에 "Output without flush"가 화면에 보이지 않을 수 있음
  ```

---

### 추천 코드 사용 패턴

아래는 위 최적화 옵션을 올바르게 사용하는 예제입니다:

```cpp
#include <iostream>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, x;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x;
        cout << x * x << '\n'; // '\n'을 사용하여 endl 대신 줄바꿈 처리
    }

    return 0;
}
```

---

### 요약

- **`ios_base::sync_with_stdio(0);`**: C와 C++ 입출력 동기화를 끊어 속도 향상.
- **`cin.tie(0);`**: `cin` 호출 시 `cout` 자동 플러시 비활성화로 성능 개선.
- **사용 시 주의**: C 표준 입출력을 섞어서 사용하지 말고, 명시적으로 플러시가 필요한 경우 처리.

https://gptonline.ai/ko/