C++ 의 입력과 출력 ( cin / cout / scanf / printf )
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++ 입출력 관련해서 배운 걸 간단히 정리해보자면 아래와 같다.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#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.18471
cout.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.184713
printf("%.9f",a/c);
// 3.184713376
}
|
cs |
코드 안에 주석으로 적은 것 처럼 문자열 출력 과정에는 다르게 처리해야 하는 이슈가 있는 것 같다.
하지만 그건 문자열 문제 레벨까지 갔을 때 다시 공부하기로 하고 오늘은 일단 여기까지!
- 190708 추가 !
printf()로 문자열을 출력할 때는 굳이 서식지정자를 쓰지 않아도 된다
printf("이렇게 써도 에러가 안난다는 말!");
- 참고사이트
TCPSCHOOL C 강의
TCPSCHOOL C++ 강의
http://tcpschool.com/cpp/intro