알고리즘 문제 처음 풀 때 은근히 어려운게 바로 입력 받는 부분이다. 문제마다 조금씩 다른데, 별거 아니면서도 안해본 사람은 그게 쉽지가 않다. 원래 알고리즘을 풀었을 때 파이썬을 이용해서 풀었는데, 언어를 C++로 바꾸면서 가장 먼저 찾아본 것도 입출력 방식이다.
기본 입출력은 `std::cin`, `std::cout`을 사용한다.
//입력 - 공백으로 나누어진 두 변수를 각각 변수1, 2에 대입
std::cin >> 변수1 >> 변수2;
//출력 - 변수1, 2, 3을 공백으로 나누어 출력하는 코드
std::cout << 변수1 << ' ' << 변수2 << ' ' << 변수3 <<'\n';
// std를 생략하려면 코드 상단에 다음 줄 추가
using namespace std;
처음 보면 조금 낯선 형태이지만 쓰다보면 편하다. 파이썬의 경우 문자열로 입력을 받아 자료형을 바꿔주어야 하지만, cin
의 경우 미리 변수를 자료형에 맞게 선언한 후에 받아오기 때문에 이후에 형변환 작업이 필요 없다.
문자열은 기본적으로 string으로 선언해서 받으면 되는데, 문제는 cin으로 입력을 받으면 공백과 개행문자를 기준으로 문자열이 끊기게 된다. 따라서 이 경우에는 getline 함수를 써줘야 한다.
우선 첫번째 매개변수로는 입력을 받는 함수가 오고, 두번째 매개변수에 저장할 변수, 세번째 매개변수에 구분자(default:'\n')를 넣어주면 된다.
// 구분자(del)가 나오기 전까지의 문자열을 text에 저장한다.
getline(cin, text, del);
+) 이전에 cin
으로 정수를 입력 받은 후에 저 코드를 쓰려면, 먼저 cin.ignore()을 해줘야 한다. 첫번째 입력에서 받은 '\n'때문에 바로 종료가 되어버리기 때문이다.
이후 입력받은 문자열을 파싱하기 위해서는 함수를 만들어서 사용해야 한다. 처음부터 만들 필요는 없고, 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);