ABOUT ME

-

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

    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

     
    반응형

    댓글

Designed by Tistory.