Game Develop

[Algorithm] 백준문제 C++로 풀 때 주의할 점 (입출력관련) 본문

Algorithm/Baekjoon

[Algorithm] 백준문제 C++로 풀 때 주의할 점 (입출력관련)

MaxLevel 2022. 5. 15. 03:56

꼭 알고리즘문제 뿐만이 아니더라도 알아두면 괜찮은 내용같다.

주로 프로그래머스에서 문제를 풀려했건만, 아무래도 백준이 유형별로 문제가 정말 많기때문에 오랜만에 백준에 들어가서 Union-Find 문제푸는데 자꾸 시간초과가난다. Union-Find문제중에서 가장 기본유형문제라서 시간초과날게 없는데 왜그러지 하다가 보니까 endl을 사용해서 그런거였다... 아래 내용은 백준에 누가 친절히 올려놓은 글중 일부 가져왔다.

링크에 들어가면 나머지 언어에 대해서도 팁이 있으니 꼭 보는걸 추천한다.

 

링크 : https://www.acmicpc.net/board/view/22716

 

C

scanf/printf는 충분히 빠릅니다.

C++

  • 아래 얘기는 cin, cout을 쓸 때의 얘기지, scanf/prinf로 입출력을 하고자 하신다면 그냥 쓰시면 됩니다. scanf/printf는 충분히 빠릅니다.
  • endl은 개행문자를 출력할 뿐만 아니라 출력 버퍼를 비우는 역할까지 합니다. 그래서 출력한 뒤 화면에 바로 보이게 할 수 있는데, 그 버퍼를 비우는 작업이 매우 느립니다. 게다가 온라인 저지에서는 화면에 바로 보여지는 것은 중요하지 않고 무엇이 출력되는가가 중요하기 때문에 버퍼를 그렇게 자주 비울 필요가 없습니다. 그래서 endl을 '\n'으로 바꾸는 것만으로도 굉장한 시간 향상이 나타납니다.
  • cin.tie(NULL)은 cin과 cout의 묶음을 풀어 줍니다. 기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데, 마찬가지로 온라인 저지에서는 화면에 바로 보여지는 것이 중요하지 않습니다. 입력과 출력을 여러 번 번갈아서 반복해야 하는 경우 필수적입니다.
  • ios_base::sync_with_stdio(false)는 C와 C++의 버퍼를 분리합니다. 이것을 사용하면 cin/cout이 더 이상 stdin/stdout과 맞춰 줄 필요가 없으므로 속도가 빨라집니다. 단, 버퍼가 분리되었으므로 cin과 scanf, gets, getchar 등을 같이 사용하면 안 되고, cout과 printf, puts, putchar 등을 같이 사용하면 안 됩니다.

 

 

 

그래서 보통 백준에서 c++로 문제푸시는분들의 코드를 보면 main함수를 아래와 같이 시작한다.

 

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    int n = 0
    int m = 0
    int s = 0;
    int a = 0;
    int b = 0;
 
    cin >> n >> m;
    
    for (int i = 0; i <= n; i++)
    {
        parent[i] = i;
    }
 
    for (int i = 0; i < m; i++)
    {
        cin >> s >> a >> b; // 0 1 3 
 
        if (s == 0)
        {
            UnionParent(a, b);
        }
        else if( s == 1)
        {
            Find(a, b);
        }
    }
 
    return 0;
}
cs