[C++] 입력 받기

스윗포테이토·2022년 10월 11일
0

알고리즘

목록 보기
2/2

알고리즘 문제 처음 풀 때 은근히 어려운게 바로 입력 받는 부분이다. 문제마다 조금씩 다른데, 별거 아니면서도 안해본 사람은 그게 쉽지가 않다. 원래 알고리즘을 풀었을 때 파이썬을 이용해서 풀었는데, 언어를 C++로 바꾸면서 가장 먼저 찾아본 것도 입출력 방식이다.

1. 기본 입력/출력

기본 입출력은 `std::cin`, `std::cout`을 사용한다.
//입력 - 공백으로 나누어진 두 변수를 각각 변수1, 2에 대입
std::cin >> 변수1 >> 변수2;
//출력 - 변수1, 2, 3을 공백으로 나누어 출력하는 코드
std::cout << 변수1 << ' ' << 변수2 << ' ' << 변수3 <<'\n';

// std를 생략하려면 코드 상단에 다음 줄 추가
using namespace std;

처음 보면 조금 낯선 형태이지만 쓰다보면 편하다. 파이썬의 경우 문자열로 입력을 받아 자료형을 바꿔주어야 하지만, cin의 경우 미리 변수를 자료형에 맞게 선언한 후에 받아오기 때문에 이후에 형변환 작업이 필요 없다.

2. 공백을 포함한 문자열

문자열은 기본적으로 string으로 선언해서 받으면 되는데, 문제는 cin으로 입력을 받으면 공백과 개행문자를 기준으로 문자열이 끊기게 된다. 따라서 이 경우에는 getline 함수를 써줘야 한다.

우선 첫번째 매개변수로는 입력을 받는 함수가 오고, 두번째 매개변수에 저장할 변수, 세번째 매개변수에 구분자(default:'\n')를 넣어주면 된다.

// 구분자(del)가 나오기 전까지의 문자열을 text에 저장한다.
getline(cin, text, del);

+) 이전에 cin으로 정수를 입력 받은 후에 저 코드를 쓰려면, 먼저 cin.ignore()을 해줘야 한다. 첫번째 입력에서 받은 '\n'때문에 바로 종료가 되어버리기 때문이다.

2-1. split()

이후 입력받은 문자열을 파싱하기 위해서는 함수를 만들어서 사용해야 한다. 처음부터 만들 필요는 없고, stringstream을 활용하면 된다.

#include <string>
#include <sstream>
#include <vector>

using namespace std;

void split(string str, char del, vector<string> &result){
    stringstream ss(str);
    string word;
    while(getline(ss, word, del)){
        result.push_back(word);
    }
    return;
}
# 파이썬은 한줄인데
arr = "Python is much easier...".split()
# 기본 delimeter가 공백이므로 arr = ["Python", "is", "much, "easier..."]

추가 - 입출력 속도 향상

간혹 아무리 생각해보 시간복잡도를 더 줄일 수 없는데 이상하게 시간초과가 나는 경우가 있다. 입력, 혹은 출력이 조금 많다면 아래 코드를 메인함수에 넣어보자!

// 입출력 속도 향상을 위해 쓰는 코드.
// 이렇게 하면 C의 입출력(scanf/printf)와는 함께 사용할 수 없다.
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글