표준 입출력

ju_bro·2022년 6월 21일
0

Algorithms Study

목록 보기
1/1
post-thumbnail

🌠 공백을 포함한 문자열

  • 공백을 포함한 문자열을 입력받을 때는 getline 함수를 사용합니다.
    (단, type이 C++ string인 경우에만 사용 가능)
string s;
getline(cin, s);
cout << s;


🌠 cin/cout 입출력으로 인한 시간초과

  • 입/출력 양이 많을 때 시간초과 방지하기 위해서는 ios::sync_with_stdio(0), cin.tie(0)이라는 두 명령을 실행시켜야 합니다.
ios::sync_with_stdio(0);
cin.tie(0);

(1) ios::sync_with_stdio(0)

scanf/printf 등에서 쓰는 C stream과 cin/cout 등에서 쓰는 C++ stream은 분리가 되어있습니다.

기본적으로 프로그램에서는 코드의 흐름과 실제 출력이 동일하게 하기 위해서 C++ stream과 C stream을 동기화하고 있습니다.

하지만 cin/cout만을 사용한다면 C stream을 사용하지 않아도 되기 때문에 쓸데 없이 시간만 잡아먹지 않도록 C stream과의 동기화를 끊어 프로그램 수행 시간에서 이득을 챙길 수 있습니다.

이때, 사용되는 동기화를 끊는 명령이 바로 sync_with_stdio(0)입니다.

  • 주의 : 동기화를 끊었다면 cout과 printf를 섞어쓰면 안됩니다.
    (섞어 쓸 경우 코드 출력 결과가 꼬일 수 있음)

(2) cin.tie(0)

기본적으로 프로그램에서는 순서가 꼬이지 않도록 cin 명령을 수행하기 전에 cout 버퍼를 비워줍니다.

하지만 온라인 저지 사이트에서 채점을 할 때는 그냥 출력 글자만 확인하기 때문에 콘솔 창에서 입력 글자와 출력 글자 사이에 순서가 설령 꼬인다고 해도 채점에 아무런 영향을 주지 않습니다.

따라서 cin 명령을 수행하기 전에 cout 버퍼를 비울 필요가 없게 됩니다.

이때, 사용되는 cin 명령을 수행하기 전에 cout 버퍼를 비우지 않도록 하는 코드가 cin.tie(0)입니다.



🌠 줄바꿈

보통의 경우 줄바꿈을 할 때 endl을 사용합니다.

이때, endl은 개행문자("\n")를 출력하고 출력 버퍼를 비우라는 명령입니다.

하지만 온라인 저지 사이트에선 프로그램이 종료될 때의 출력이 어떻게 생겼는지를 가지고 채점을 진행하기 때문에 중간 중간 버퍼를 비운다면 채점에 영향이 갈 수 있습니다.

따라서 줄바꿈이 필요하면 endl이 아닌 그냥 개행문자를 출력하면 됩니다.



이 글은 "BaaaaaaaarkingDog" 님의 [실전 알고리즘] 강의를 듣고 개인적으로 학습하기 위해 정리한 글입니다. 🙂

https://www.youtube.com/playlist?list=PLtqbFd2VIQv4O6D6l9HcD732hdrnYb6CY

profile
Inha University

0개의 댓글