본문 바로가기

알고리즘 시*련아

C++ 입력 정리

1. 변수 입력

std::cin의 경우

int a, b;
std::cin >> a; 
std::cin >> a >> b; //다중 입력

c++ 강의를 들으면 처음으로 배우는 c++국룰 입력 방법이다

하지만 이 방식에는 문제가 있다.

 

첫번째로 입력의 형태이다

$10	//터미널 입력
10\n	//실제 입력

터미널에 10을 입력하고 엔터를 누르면 10뒤에 \n까지 입력이 된다

그렇기 때문에 정수를 입력할때 cin은 숫자뒤에 \n을 놔두고 숫자만 입력하게 된다.

문제는 이것을 string이나 char입력을 같이 사용할때 나타난다

숫자는 \n을 입력하지 못하므로 \n을 버리고 입력하는데,

\n을 포함할 수 있는 string이나 char을 입력하게되는 경우 그 전에 cin에서 입력하고 버퍼에 남은 \n을 입력하게 된다.

int a;
string b;

cin >> a;	(10 입력)
cin >> b;	(입력버퍼에 남은 \n 입력)

cout << a << endl;
cout << b << endl;
--터미널--
$ 10

--출력--
10
(공백 - \n이 출력되므로)

그래서 여러가지 테스트케이스를 읽어드릴때 하나가 무시당하는 경우가 생기기도 한다.

이를 예방하기 위해서 cin.ignore을 이용하여 입력버퍼를 비워야 한다

 

두번째로 속도가 느리다

 

나도 처음 이 방식을 사용하여 백준 10871번 X 보다 작을 수 문제를 풀었을때 발견했는데,

너무 쉬워서 대뇌피질만 사용하여 풀 수 있을것 같은 문제가 424ms나 걸렸던 것이다.

 

입력만으로 이렇게 많은 시간을 잡아먹는다는것은 알고리즘을 풀때 문제가 될 수 있으니 다른 방법을 찾아 보았다.

 

scanf의 경우

int a, b;
scanf("%d", &a);
scanf("%d %d", &a, &b);

이 방법은 c에서 사용되는 scanf 방법이다.

형식을 적고 뒤에 변수의 포인터를 넘겨주면 된다.

 

아까 그 10871의 코드를 scanf로 수정해보니 바람직하게도 0ms로 채점되었다.

 

 

2. 배열 입력

(2022.7.11 기준)

배열의 길이를 알고있는 경우

int n;
scanf("%d", &n); // 변수의 크기 입력

int arr[n]; // 변수 선언

for(int i=0; i < n; i++){ // 변수의 크기 만큼 반복하여 입력
	scanf("%d", &arr[i]);
}

배열의 크기만큼 반복하여 scanf를 통해 하나하나 읽어가며 배열에 저장하는 방식이다

 

3. string 입력

std::cin

string a;

cin >> a;
cout << a << endl;

여타 다른 c++입력처럼 cin를 이용하여 인풋을 받는다.

주의하여야 할것은 cin으로 인풋을 받을 경우 공백으로 끊어 읽는다.

string a, b;

cin >> a >> b;		//입력: abc def
cout << a << endl;	//출력: abc
cout << b << endl;	//출력: def

또한 위에 언급한대로 cin.ignore을 통해 입력버퍼를 비워주어야 한다

 

istream::getline()

string a;

getline(cin, a) //입력
cout << a; //출력

getline은 cin과 다르게 공백을 모두 포함해서 읽어 들인다.

'알고리즘 시*련아' 카테고리의 다른 글

C++ 삽입 정렬 - 정렬3  (0) 2022.08.04
C++ 버블정렬 - 정렬2  (0) 2022.08.02
C++ 선택정렬 - 정렬1  (0) 2022.08.02
C++ 이중배열  (0) 2022.07.25
C++ 문자열 동적 할당  (0) 2022.07.14