-
C++ 의 입력과 출력 ( cin / cout / scanf / printf )Knowledge/C++ 2019. 7. 7. 20:31반응형
BOJ 2588번 문제( https://www.acmicpc.net/problem/2588 ) 를 풀면서 알게 된 것
1단계 레벨에서 이 문제 이전까지는
머리를 쓸 필요가 조금도 없었기에 ( 이 놈의 건방...) 답을 맞히고도 다른 분들 코드를 보지 않았는데
이 문제는 다 풀고나서 다른 분들이 어떻게 구현해놨는지 궁금해 코드를 살짝 봤다.
다행히(?) 로직은 아무런 차이가 없었지만 나는 입출력을 cin과 cout으로 처리한 반면
다른 분들은 입출력을 scanf 와 printf를 사용해 처리하고 있음을 확인할 수 있었다.
TCP스쿨 강의에 나와있던 cin과 cout밖에 모르던 C++린이인 나는 바로 이 입출력 방식간의 차이에 대해 검색해봤는데
그 중 'C/C++ 입출력 속도 비교' ( https://cupjoo.tistory.com/97 )라는 포스팅에서 놀라운 내용을 확인할 수 있었다
결론만 옮기자면 cin과 cout보다는 scanf와 printf가 더 빨라서
cin과 cout으로 입출력을 처리하면 시간 제한에 걸리지만
scanf와 printf로 입출력을 처리하면 통과하는 케이스가 있다는 것
그 내용을 확인하자마자 scanf와 printf의 사용법을 간단히 익히고
1단계 알고리즘 문제 전체를 이를 활용해 다시 풀며 손에 익혔다
로직에서 틀린 게 없는데 cin과 cout을 썼다는 이유로 시간 제한에 걸리면 너무 억울할 거 같아서.. ㅋ
아무튼 그렇게 C++ 입출력 관련해서 배운 걸 간단히 정리해보자면 아래와 같다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677#include <stdio.h>// scanf() , printf()를 사용하기 위해선 #include <stdio.h> 선언 필요#include <iostream>using namespace std;// cin, cout을 사용하기 위해선 #include <iostream> 과 using namespace std; 선언 필요int main(void){int a = 10;int b = 3;double c = 3.14;double d = 0.001592;// 이 포스팅에선 제가 아직 C++ 초보인 관계로 int와 double형만 다룹니다// 문자열을 다루는 방법은 접근 법이 조금 다른 것 같으니 다른 포스팅을 참고하세요cin >> a >> b ;// 입력방법 1 - cin// - 특이점// 1. 변수 방향으로 향하는 화살표를 함께 쓴다.// 처음엔 방향이 헷갈렸는데 '여기에 집어넣어라'로 기억하기로 했다scanf("%d \n",&a);// 입력방법 2 - scanf// 특이점// 1. 입력받은 데이터를 어떤 형식으로 변환할지 지정할 수 있다// ( ex : %d = 정수 , %f = 실수.. 물론 더 많다 자세한 건 다른 포스팅 참고 )// 2.주소 연산자 (&)를 사용한다. 입력받은 데이터를 이 기호 뒤의 변수에 저장하라는 의미// 3. 서식지정자를 이용해 여러개의 데이터를 한번에 받을 수도 있다.scanf("%d %f",&a,&c);// 위와 같이 받으면 순서대로 변수에 값이 할당된다cout << a/b << endl;// 3// 출력 방법 1 - cout// 특이점// 1. cout 방향으로 향하는 화살표를 함께 쓴다.// 이 역시 처음엔 헷갈렸는데 '이걸 출력해줘'로 기억하기로 했다// 2. 줄바꿈을 위해선 endl;을 함께 써준다// 3. cout.precision을 활용하면 출력 범위를 설정할 수 있다cout << a/c << endl;// 3.18471cout.precision(10);cout << a/c << endl;// 3.184713376// 위와 관련한 더 자세한 내용은 https://takeknowledge.tistory.com/13 에서 확인 가능printf("%d \n", a/b);// 3// 출력방법 2 - printf();// 특이점// 1. scanf와 같이 서식지정자를 활용해 출력할 데이터의 서식을 지정할 수 있다.// 2. 아래와 같이 다른 문자열과 함께 사용할 수도 있다printf("%d를 %d으로 나눈 값은 %d입니다 \n",a,b,a/b);// 10를 3으로 나눈 값은 3입니다// 3. 서식지정자 뒤에 \n을 써주면 줄바꿈 된다// 4. 아래와 같이 서식지정자를 활용해 출력 범위를 설정할 수 있다.printf("%f \n",a/c);// 3.184713printf("%.9f",a/c);// 3.184713376}cs 코드 안에 주석으로 적은 것 처럼 문자열 출력 과정에는 다르게 처리해야 하는 이슈가 있는 것 같다.
하지만 그건 문자열 문제 레벨까지 갔을 때 다시 공부하기로 하고 오늘은 일단 여기까지!
- 190708 추가 !
printf()로 문자열을 출력할 때는 굳이 서식지정자를 쓰지 않아도 된다
printf("이렇게 써도 에러가 안난다는 말!");
- 참고사이트
TCPSCHOOL C 강의
TCPSCHOOL C++ 강의
http://tcpschool.com/cpp/intro
반응형'Knowledge > C++' 카테고리의 다른 글
C++ EOF 처리 방법 ( 백준 10951 A+B - 4 ) (6) 2019.07.11 문자열을 출력하고 줄을 바꿔주는 puts() 함수 (0) 2019.07.08 C++ double 자료형 나머지연산(%) (0) 2019.07.05 C++ 소수점 출력 범위 설정하기 (0) 2019.07.05 알고리즘 문제풀이 (PS)에 적합한 C++ 버전 (0) 2019.07.01