티스토리 뷰
scanf와 printf
scanf (Scan Formatted)
scanf는 표준 입력에서 형식화된 데이터를 읽어들이는 입력함수다.
int a;
double b;
scanf("%d %lf", &a, &b);
- 형식 지정자를 통해 입력 데이터의 타입을 지정
- 변수의 주소를 인자로 받아 해당 메모리에 직접 값을 저장
printf (Print Formatted)
scanf는 형식화된 데이터를 표준 출력으로 내보는 출력함수다.
int a = 10;
double b = 3.14;
printf("정수: %d, 실수: %.2f\n", a, b);
- 형식 지정자를 통해 출력 형식을 지정
- 변수의 값을 직접 인자로 전달
주요 형식 지정자:
- %d: 정수
- %f: 부동소수점 수
- %c: 문자
- %s: 문자열
cin과 cout
cin (Console Input)
cin은 표준 입력(주로 키보드)에서 데이터를 읽어들이는 입력 함수다.
int a;
double b;
cin >> a >> b;
- 스트림 추출 연산자(>>)를 사용
- 자동으로 입력 데이터의 타입을 변환
- 연속적인 입력 가능
cout (Console Output)
cout은 데이터를 표준 출력(주로 콘솔 화면)으로 내보내는 출력 함수다.
int a = 10;
double b = 3.14;
cout << "정수: " << a << ", 실수: " << b << endl;
- 스트림 삽입 연산자(<<)를 사용
- 다양한 데이터 타입을 자동으로 처리
- 연속적인 출력 가능
C와 C++ 표준 입출력의 차이점
두 표준 입출력의 차이는 뭘까?
내 생각에는 크게 두가지가 있는것 같다.
- 타입 안정성
- 성능
타입 안정성
scanf/printf는 런타임에 성능을 체크하기 때문에 런타임시에 오류나 예기치 못한 동작이 발생할 수도 있다.
그에 비해 cin/cout은 컴파일 시점에 타입을 체크하기 때문에 잘못된 타입을 사용해도 커파일 오류가 발생해 초기에 문제를 발견할 수 있다.
성능
scanf/printf은 다음과 같은 이유로 일반적으로 더 빠르다고한다.
- 단순한 구조와 직접적인 메모리 접근으로 인해 기본적으로 빠른 성능을 보인다.
- 형식 지정자를 통한 직접적인 데이터 해석으로 오버헤드가 적다.
cin/cout은 기본적으로 C 표준 입출력과의 동기화, 타입 안전성 체크 등으로 인해 더 느리지만 ios_base::sync_with_stdio(0)과 cin.tie(0) 함수를 통해 더 빠르게 만들수 있다.
ios_base::sync_with_stdio(false); cin.tie(nullptr)
이미지 출처 : https://algospot.com/forum/read/2496
이 두가지 명령어를 이용하면 사진에서 보는바와 같이 cin/cout 입출력 속도를 향상시킬수 있다.
ios_base::sync_with_stdio(false);
기본적으로 C++의 iostream은 C의 stdio와 동기화되어 있다 이 동기화로 인해 printf()와 cout을 섞어 사용해도 출력 순서가 섞이지 않고 차례대로 출력된다. 하지만 이 동기화는 성능 저하의 원인이 되는거다.
ios_base::sync_with_stdio(false) 명령어는 C의 stdio와 C++의 iostream 사이의 동기화를 비활성화시킨다.
이를 통해 iostream의 성능이 크게 향상되어 실행속도가 빨라지게 된다.
주의사항:
- 동기화를 비활성화 시켰기 때문에 이 설정 후에는 C의 stdio 함수(printf, scanf 등)와 C++의 iostream을 섞어서 사용하면 안된다.
cin.tie(nullptr);
기본적으로 cin은 cout과 묶여(tied) 있다. 이 묶음으로 인해 cin으로 입력받기 전에 cout의 버퍼가 자동으로 비워진다. 버퍼가 비워지는 과정이 있기 때문에 성능저하가 발생한다. cin.tie(nullptr) 명령어를 사용하면 cin과 cout의 묶음 (tie)를 해제 시키고 버퍼가 비워지는 과정을 생략하게된다.
이를 통해 입력 작업의 속도가 향상되게 된다. 특히 입출력 작업이 많은 프로그램에 효과적이다.
주의사항:
- 버퍼를 비우지 않기 때문에 입력 전에 출력 버퍼를 수동으로 비우고 싶다면 cout << flush;를 사용해야 한다.
결론
알고리즘을 풀때는 cin/cout을 성능 최적화를 통해 사용하는게 제일 좋을거 같다
추천문제
https://www.acmicpc.net/problem/15552
'알고리즘' 카테고리의 다른 글
[백준 1647] 도시 분할 계획 - cpp로 구현한 최소 신장 트리 (0) | 2024.10.17 |
---|---|
코딩테스트를 위한 JavaScript 문법 정리 (1) | 2024.10.03 |
[백준 3986] 좋은 단어 - c++로 구현한 스택 (해설 O) (0) | 2024.08.14 |
[백준 6198] 옥상 정원 꾸미기 - C++로 구현한 스택 (0) | 2024.08.09 |
[백준 5397] 키로거 - C++로 구현한 연결리스트 (0) | 2024.08.06 |