주의할 점
백준 문제를 풀다가 아래 코드가 틀렸었다.
왜 틀렸나 봤는데 ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
이 부분 때문이었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<string>
using namespace std;
int arr[53];
int ans[53];
string a;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x]++;
}
getchar();
getline(cin, a);
for (int i = 0; i < n; i++) {
if (a[i] >= 'A' && a[i] <= 'Z')
ans[a[i] - 'A' + 1]++;
else if (a[i] >= 'a' && a[i] <= 'z')
ans[a[i] - 'a' + 27]++;
else if (a[i] == ' ')
ans[0]++;
}
bool flag = true;
for (int i = 0; i < 53; i++) {
if (arr[i] != ans[i])
flag = false;
}
if (flag == false)
cout << 'n';
else
cout << 'y';
}
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
이 코드는 C와 C++의 표준 stream의 동기화를 끊는 역할을 한다.
cin과 cout의 속도가 C의 입출력 속도에 비해 떨어지기 때문에 저 코드를 사용해 속도를 높이는 기능으로 사용한다.
자세한 내용은 이 글을 참고
하지만 동기화를 끊게되면 C의 입출력 함수를 더 이상 사용하지 못하는데
그 동안 printf와 scanf만 주의하면 된다고 생각했었는데 getchar도 C에서 쓰이는 입출력 함수이다.
그렇기 때문에 위에 getchar를 사용하지 못해 위의 코드는 틀렸습니다가 나오는 것이다.
비쥬얼스튜디오에서는 동기화를 끊어도 섞어쓰면 알아서 처리해주는 것 같지만 채점프로그램에서는 그렇지 않다.
그렇기 때문에 항상 ios::sync_with_stdio(false);
를 쓴다면 C의 입출력을 쓰지않도록 조심해야한다.
위의 틀린 코드는
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<string>
using namespace std;
int arr[53];
int ans[53];
string a;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x]++;
}
getline(cin, a);
getline(cin, a);
for (int i = 0; i < n; i++) {
if (a[i] >= 'A' && a[i] <= 'Z')
ans[a[i] - 'A' + 1]++;
else if (a[i] >= 'a' && a[i] <= 'z')
ans[a[i] - 'a' + 27]++;
else if (a[i] == ' ')
ans[0]++;
}
bool flag = true;
for (int i = 0; i < 53; i++) {
if (arr[i] != ans[i])
flag = false;
}
if (flag == false)
cout << 'n';
else
cout << 'y';
}
이런식으로 getline을 한번 더 써서 개행문자를 처리하도록 했다.
위의 코드는 정답처리 되었다.