오늘은 C++로 백준 15552번을 풀면서 부딪혔던 난관...
ios_base::sync_with_stdio(false)
와cin.tie(NULL)
에 대해 알아보고자 한다.
ios_base::sync_with_stdio(false)
ios_base::sync_with_stdio
구문은 c의 stdio와 cpp의 iostream을 동기화시켜주는 역할을 한다.
이 때 iostream과 stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하게 된다.
따라서 ios_base::sync_with_stdio(false)
를 이용해 동기화를 비활성화 해준다.
그렇게 되면 C++만의 독립적인 버퍼가 형성되어 C의 버퍼와 병행 사용은 불가하다.
그러나 사용하는 버퍼의 수가 줄었기 때문에 실행 속도는 빨라지게 된다.
버퍼가 분리되었기 때문에 cin과 C의 scanf, gets, getchar 등을 같이 사용하면 안 되고 cout과 C의 printf, puts, putchar 등을 같이 사용하면 안 된다.
📌 버퍼 : 입력과 출력을 조금 더 효율적으로 할 수 있게 해주는 임시 메모리 공간
버퍼를 사용하지 않은 입력 ➡ 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달
버퍼를 사용한 입력 ⬇⬇
(1) 키보드의 입력이 있을 때 마다 한 문자씩 버퍼로 전송
(2) 버퍼가 가득 차거나, 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달
cin.tie(NULL)
cout
과 cin
은 묶여있다. 때문에 다른 스트림이 작업 요청할 경우 자동적으로 버퍼를 flush하는 것을 보장한다.cin.tie(NULL)
을 이용하여 cin
과 cout
의 묶음을 풀어주면 시간을 단축시킬 수 있다.❗ 입출력 순서를 보장 받을 수 없다는 단점이 존재한다.
endl
에 대하여endl
은 개행의 역할만 하는 것이 아니라 버퍼를 flush하는 역할도 하기 때문에endl
대신 "\n"
을 이용해 개행하는 것이 바람직하다.앞으로
cout
과cin
을 이용하여 알고리즘을 풀 때는 시간 단축을 위해
ios_base::sync_with_stdio(false)
와cin.tie(NULL)
을 이용하도록 하자.
추가로"\n"
을 이용하는 것도 잊지 않기!
오오오오