[핵심암기]

1.cin >> a >> b; 로 띄어쓰기가 자동으로 처리되어 입력을 받을 수 있다.

1.문제

https://www.acmicpc.net/problem/1000

 

2.정답 코드

 

#include <iostream>

using namespace std;

int main() {
	
    ios::sync_with_stdio(false);
    cin.tie(0);
	
	int a, b, c;
    
    cin >> a >> b;
    c = a + b;
    cout << c << "\n";
}

3.배운점

3-1. 띄어쓰기가 포함된 숫자 2개 입력 받기

c++에서는 다음과 같이 띄어쓰기가 포함된 연산을 입력 받을 수 있다.

cin이 자동으로 띄어쓰기를 처리해준다.

cin >> a >> b;

 

3-2. python의 input()처럼 한 줄로 입력받는 법

#include <iostream>
#include <string> //문자열 사용을 위해 필요하다.

using namespace std;

int main() {
	ios::sync_with_stdio(false);
    cin.tie(0);
    
	string input_line;
	getline(cin, input_line);

	cout << "You entered: " << input_line <<"\n";

	return 0;
}

 

3-2. python과의 입력 코드 및 시간 비교

python에서는 모든 입력을 문자열로 받는다. 따라서 문자열을 입력 받고 쪼갠 다음 각각의 문자에 매핑해줘야하는 코드였다.

a, b = map(int,input().split())

 

언어 메모리 시간
python 113112KB 128ms
c++ 2020KB 0ms

간단한 입출력 예제인데도

메모리는 약 5배 시간은 c++은 거의 걸리지 않는 정도로 차이난다.

왜 c++을 알아야한다고 하는지, 확실히 체감이 되기 시작한다.

[핵심암기]

1. c++코드 짤 때 효율적인 기본 세팅은 다음과 같습니다. #iostream #namespace #"\n"

#include <iostream>

using namespace std; // namespace 한 번에 가져오는 tip

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
    
	std::cout << "Hello, World!" << "\n";
	return 0;
}

 

1. C++ 3가지 입출력 정리

C++에는 기본적으로 3가지 입출력 방식이 있습니다.

 

3번 cstdio > 2번 stdio.h > 1번 iostream 순서로 메모리 성능이 더 좋습니다.

 

1.iostream : C++의 표준 입출력 헤더파일 입니다. 대표적으로 cin, cout이 있습니다.

iostream도 입출력을 빠르게 할 수 있는 방법이 있긴 합니다. 나중에 공부해보세요.

#include <iostream>

main() {
	int a;
    std::cin >> a;
    std::cout <<a;
}

 

2.stdio.h : C++은 기본적으로 C의 확장버전입니다. 즉, C의 표준 라이브러리를 사용할 수 있기 때문에 C의 표준 라이브러리 헤더 파일들을 include하여 해당 함수들을 사용할 수 있습니다.

#include <stdio.h>

main() {
	int a;
    scanf("%d", &a);
    printf("%d", a);
}

 

3.cstdio : stdion.h와 크게 다를 것은 없습니다. C언어에서는 namespace 개념이 없지만, c++에서는 namespace를 지원하면서 C언어의 표준 라이브러리를 namespace안에서도 사용할 수 있도록 한 것입니다. 함수 기능상에서는 차이가 없습니다.

#include <cstdio>

main() {
	int a;
    scanf("%d", &a); // std::scanf도 가능
    printf("%d", a); // std;:printf도 가능
}

 

2. [백준 C++] 2557번 : Hello World

위에서 배운 3가지 방법으로 문제를 풀어보겠습니다.

 

1.iosream

#include <iostream>

int main() {
	std::cout << "Hello World!";
    return 0;
}

 

2.stdio.h

#include <stdio.h>

int main() {
	printf("Hello World!");
    return 0;
}

 

3.cstdio

#include <cstdio>

int main() {
	printf("Hello World!");
    return 0;
}

 

3. C++ 입출력 속도 해결

시간초과 방지를 위해서 아래 두 줄을 추가해주는 것이 좋습니다.

ios::sync_with_stdio(false);
cin.tie(0);

기존 입출력을 cin, cout, printf, scanf 함수를 이용했다가,

위의 두 줄을 추가하고 cin, cout만 사용하면 입출력 속도가 빨라집니다.

 

3-1. ios::sync_with_stdio(false)

이 코드는 C와 C++ 표준 stream의 동기화를 비활성화합니다.

동기화가 활성화 되어있다는 것의 의미는, C 스타일과 C++ 스타일의 입출력을 혼합해도 문제가 없습니다.

예를 들어 C스타일(printf, scanf)과 C++스타일(cin cout)을 혼합하여 사용해도 문제가 없습니다.

 

하지만 위의 코드를 추가하게 되면, 두 스타일 혼합은 할 수 없지만,

C++ 스타일 코드만 사용하면, 기존 동기화 과정에서 필요하던 시간이 절약되어 입출력 속도가 빨라집니다.

 

다만, 이 코드를 사용하면 기존 C의 표준 입출력인 scanf, printf, getchar 함수 사용시 오류가 납니다.

따라서 C++의 입출력인 cin, cout만 사용하도록 주의해야합니다.

 

3-2. cin.tie(0);

cin.tie는 평소 cin과 cout을 묶어줍니다.

예를 들어서 아래와 같은 코드가 있다고 생각해봅시다.

cout << "이름을 입력하세요" <<;
cin >> name;

평소에는 cin과 cout이 묶어져 있으므로,

반드시 "이름을 입력하세요"가 출력된 후 이름을 입력할 수 있습니다.

 

하지만 cin.tie(0) 혹은 cin.tie(null) 코드를 추가해주면,

"이름을 입력하세요"가 출력되기 전에 이름을 입력할 수 있습니다.

 

평소에는 이름을 묻기도 전에 이름을 입력할 수 있는 어색한 상황이 펼쳐지겠지만,

알고리즘 문제를 풀 때는 상관없기 때문에 이 코드를 많이 사용합니다.

 

일반적으로는 scanf printf가 cin cout보다 빠릅니다.

하지만 위에서 다룬 2줄의 코드를 추가하고, 두 줄을 입력한 뒤 프로그래밍 하는 것이 좋습니다.

 

3-3. 사용 시 주의할 점

두 호출은 성능과는 아무 관련 없는 다른 의미를 가집니다.

웬만하면 알고리즘 문제 풀 때만 시간 절약을 위해 사용합시다.

모든 프로그램에 입출력 시간을 절약하기 위해 사용하는 것은 잘못된 방법입니다.

 

4. 입출력 시 시간 절약을 위하여

입출력시 개행할 때, endl 대신 '\n'을 사용해야 시간 절약을 할 수 있습니다.

둘 다 개행 문자라는 점에서 차이는 없습니다.

 

하지만 endl은 버퍼를 비우고 즉시 ans 부분을 출력합니다. 버퍼를 지우는 과정 때문에 속도가 더 느립니다.

"\n"은 단순히 개행만 해주고, 버퍼를 비우는 역할은 없습니다.

 

1)  endl

std::cout<<ans<<std::endl;

2) "\n"

std::cout<<ans<<'\n';

 

5. 입출력 절약한 백준 2557번 나의 최종 코드

#include <iostream>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cout << "Hello World!" <<"\n";
    return 0;
}

 

[참고자료]

연습을 위해 아래 두 글을 상세하게 참고하였습니다.

https://st-lab.tistory.com/200

https://dingcoding.tistory.com/62

나는 현재 NEXT에서 알고리즘 스터디를 진행하고 있다.

빠른 바로 가기를 위해서 다음 링크를 추가해둔다. 오 그리고 옆에다가 간단히 내용도 정리해두면 좋겠다.

 

200 - 자료구조 1

201 - 자료구조 1 (연습)

203 - 자료구조 1 (참고)

300 - 수학 1

301 - 수학 1 (연습)

303 - 수학 1 (참고)

400 - 다이나믹 프로그래밍 1

401 - 다이나믹 프로그래밍 1 (연습)

402 - 다이나믹 프로그래밍 1 (도전)

+ Recent posts