Knowledge/C++

C++ 의 입력과 출력 ( cin / cout / scanf / printf )

TakeKnowledge 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++ 입출력 관련해서 배운 걸 간단히 정리해보자면 아래와 같다.

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/<< endl;
    // 3
    
    // 출력 방법 1 - cout
    // 특이점
    // 1. cout 방향으로 향하는 화살표를 함께 쓴다.
    //    이 역시 처음엔 헷갈렸는데 '이걸 출력해줘'로 기억하기로 했다
    // 2. 줄바꿈을 위해선 endl;을 함께 써준다
    // 3. cout.precision을 활용하면 출력 범위를 설정할 수 있다 
    cout << a/<< endl;
    // 3.18471
    
    cout.precision(10);
    cout << a/<< 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 강의

     http://tcpschool.com/c/intro

 

     TCPSCHOOL C++ 강의

     http://tcpschool.com/cpp/intro

 
반응형