문제를 풀다 알게된 점을 소개하려 합니다.
보통 C로 문제를 풀 땐 scanf로 입력을 받는 것이 보통입니다. (제가 그렇습니다)
근데 이 문제는 scanf로 풀면 안되더라고요?? 21개의 TC 중에 0개부터 바로 시간초과 빡 !
이것 저것 수정해보다가 입력을 어떻게 받는지에 따라서 속도 차이가 있다고 해서 그 부분에 대해 공부를 해보고 다시 수정을 해보았습니다.
그래서 getchar()로 scanf를 대체해서 정답을 제출했더니 맞다고 떴습니다.
문제가 되는 부분은 아래와 같습니다.
for (int i = 0; i < N; i++) {
for (int j = 0; j < T; j++) {
scanf("%d", &num);
arr[i][j] = num;
if (num == 0) {
score[j] += 1;
}
}
}
요기서 시간초과가 떠서 이 부분을
for (int i = 0; i < N; i++) {
for (int j = 0; j < T; j++) {
while (1) {
num = getchar();
if (num == '0' || num == '1') {
arr[i][j] = num - '0';
if (num == '0') score[j] += 1;
break;
}
}
}
}
요렇게 바꿨더랬죠. 입력은 아래와 같습니다. 세로가 N 가로가 T
1 1 0
1 0 1
1 0 0
1 1 1
getchar()의 경우 띄어쓰기도 받아버리니 while문을 돌려서 '0'과 '1'만 받아오는 식으로 풀이를 진행했습니다.
알아본 결과 scanf의 경우 getchar()보다 느리다고 합니다.
https://www.acmicpc.net/blog/view/56
사실 이 글에 왜 scanf가 getchar보다 느린지를 적으려고 했는데, 이유를 못 찾겠네요.
찾는 즉시 글을 수정하도록 하겠습니다. 우선은 저 공리 정도만 알고 계셔도 알고리즘 문제를 푸는데 충분할겁니다.
찾았습니다.
https://pediaa.com/what-is-the-difference-between-scanf-and-getchar/
위 URL에 정리가 참 잘되어있는데 결론을 해석을 하자면 scanf가 유저가 키보드에서 보낸 데이터를 받아서 타입을 분석하는 시간에 getchar는 그냥 바로 읽어버립니다.
그래서 getchar는 데이터 타입을 분석하는 시간을 줄일 수가 있으니 getchar가 scanf보다 빠르다는 것을 알 수 있습니다.
이상 scanf의 맹점 (2) / 입출력 속도 였습니다. ^_^
'C > 개념' 카테고리의 다른 글
C에서 문자열 반환하는 함수 만들기 (1) | 2020.01.29 |
---|---|
scanf의 맹점 / 입력 버퍼 (0) | 2019.12.10 |
"const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다. - 에러 수정 (5) | 2019.12.02 |
Hash 구현 (0) | 2019.08.18 |
Hash 알고리즘 (0) | 2019.08.10 |