코딩테스트를 위해서 C++을 활용하는 중 간단한 입력 부분임에도 어떤 차이가 있나 싶어 알아보았다. 입력을 받는 경우 특히 BFS에서 숫자가 붙어서 주어지는 경우가 존재한다.
4 6
101111
101010
101011
111011
첫 번째 방법. Scanf("%1d")(추천방법)
const int max_n = 104;
int n, m, a[max_n][max_n];
int main() {
scanf("%d %d", &n, &m);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
scanf("%1d", &a[i][j]); // 숫자 하나씩 받기
}
}
return 0;
}
이런 식으로 숫자가 주어지곤 하는데 가장 편한 방법은 scanf로 통일해서 받는 방법이다.
다음과 같은 방법으로 받을 수 있으며, 이렇게 받으면 별도로 변환을 해줄 필요가 없어 편하다.
두 번째 방법. cin
int main() {
cin >> n >> m;
for(int i=0; i<n; i++){
string s;
cin >> s;
for(int j=0; j<s.length(); j++){
a[i][j] = s[j] - '0';
}
}
cout << "\n";
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cout << (int)a[i][j];
}
cout << "\n";
}
return 0;
}
만약 cin, cout이 편해서 받고자 하는 경우 이렇게 받을 수도 있다. 다만 이렇게 받으면 int 처리를 별도로 해주기 위해서 - '0' 이라는 코드를 넣어줘야 하기도 하고 속도측면까지 고려한다면 cin, cout이 독립적 버퍼를 갖게 하기 위해서 C와 C++사이의 버퍼 동기화를 끊어줘야 한다.
코드는 다음과 같다
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
위와 같은 코드를 작성해주면 되는데 C++은 C와 입출력 방식을 제한 없이 섞어 쓸 수 있다고 한다.
이걸 false로 만들어주면서 여러 주의사항들이 생기는데 현업에서는 당연히 이런 제약이 생기는 게 괜찮은 경우가 없다시피 하니 제외하고, 코딩테스트 목적으로 한다면 그래도 scanf를 추천한다. 굳이 코드를 길게 늘어뜨릴 필요가 없기 때문이다.
또, 만약 scanf와 cin, cout을 혼용해서 쓰고 있다면 적어도 같은 문제에서는 입, 출력을 통일해서 하는 것이 효율적이다. cin, cout은 scanf에 비해 속도가 2배가량 느리기 때문에 위처럼 버퍼를 끊어주는 코드가 필요한데 어차피 scanf도 써야 하고, cin, cout도 써야 한다면 하나로 통일하는 게 유리하기 때문이다.(코드 양, 속도 면에서 모두)
'ETC > 알고리즘용C++' 카테고리의 다른 글
코테용 C++ 기본 문법 레퍼런스 (0) | 2023.02.26 |
---|