본문 바로가기

C/개념

scanf의 맹점 (2) / 입출력 속도

반응형
SMALL

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW45RuSae2gDFAQ7&categoryId=AW45RuSae2gDFAQ7&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제를 풀다 알게된 점을 소개하려 합니다.

 

보통 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

 

입력 속도 비교

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일을 입력받는데 걸리는 시간을 측정. 10번 측정해서 평균값으로 순위를 매김 순위 언어 입력 방법 평균 (초) 1 C11 mmap 0.043 2 C11 fread 0.0799 3 C11 getchar 0.3496 4 C++17 ios_base::

www.acmicpc.net


사실 이 글에 왜 scanf가 getchar보다 느린지를 적으려고 했는데, 이유를 못 찾겠네요.

 

찾는 즉시 글을 수정하도록 하겠습니다. 우선은 저 공리 정도만 알고 계셔도 알고리즘 문제를 푸는데 충분할겁니다.

 

찾았습니다.

 

https://pediaa.com/what-is-the-difference-between-scanf-and-getchar/

 

What is the Difference Between scanf and getchar - Pediaa.Com

The main difference between scanf and getchar is that the scanf is a formatted way of reading an input from the keyboard while getchar reads a single character from the keyboard. Furthermore, while scanf function takes the format string and variables with

pediaa.com

위 URL에 정리가 참 잘되어있는데 결론을 해석을 하자면 scanf가 유저가 키보드에서 보낸 데이터를 받아서 타입을 분석하는 시간에 getchar는 그냥 바로 읽어버립니다.

 

그래서 getchar는 데이터 타입을 분석하는 시간을 줄일 수가 있으니 getchar가 scanf보다 빠르다는 것을 알 수 있습니다.


이상 scanf의 맹점 (2) / 입출력 속도 였습니다. ^_^

반응형
LIST