알고리즘 스킬 강의 no.1
이번에는 최근에 들었던 간단하지만 매우 중요한 스킬에 대한 세미나를 정리할 것이다. 주로 입출력이나, stl사용법에 대한 것이 될
것이다.
1.scanf/printf에 대한 고찰
c에서 c++로 옮겨타서 알고리즘 공부를 진행하면 매우 편한 점이 하나 있다. 그것은 바로 입출력에 대한 편리성.
iostream네임 스페이스가 제공하는 많은 오버라이드형 클래스가 간단한 설정만으로도 매우 파워풀한 성능을 내주기 때문에
사실 c++이 알고리즘 풀이에 가장 적당한 것이 사실이다.
하지만 문제의 난이도가 점점 올라가며, 문제에서 원하는 성능 조건이 까다로워질 수록 이것은 굉장한 한계점이 되기도 한다.
그래서 다시 scanf/printf로 돌아갈 필요성이 있는데, 지금부터 공부할 몇몇 조건들이 사용하기에도 편한 기능을 가져다 준다.
포맷 문자열
- %d : 정수
- %i : 정수(형태에 따라 다르게 입력 받음)
- %x : 16진수 정수
- %o : 8진수 정수
- %s : 문자열
- %c : 문자
- %f : 문자
- %lf : float
- %Lf : long double
%i
%i는 입력으로 들어오는 수의 형태에 따라 다르게 입력 받는다.
#include<iostream>
#include<cstdio>
int main()
{
int x, y;
while (true)
{
printf("input : ");
scanf("%d %i", &x, &y);
printf("output : ");
printf("%d %d \n", x, y);
}
return 0;
}
%i를 사용하게 되면 8 10 16진수의 숫자들을 자동으로 변환해서 10진수로 받을 수 있다.
scanf의 리턴값
scanf의 리턴값은 성공적으로 입력받은 인자의 개수이다. 따라서 파일의 끝까지 입력받아야 하는 경우에는
while(scanf("%d %d", &a, &b)==2)
와 같이 사용할 수 있다.
scanf는 공백과 줄바꿈을 무시한다
scanf는 공백과 줄바꿈을 무시해준다. 그래서 편한점도 분명 있지만 반대로 반드시 받아야 할 입력을 못받는 경우가 발생한다. 이때 사용하는 방법 중 하나는 포맷 앞부분에 정규표현식을 사용하여 공백을 제외해주는 것이다.
scanf("%[^\n]\n",s);
숫자의 합
scanf("%1d", &x);
포맷앞에다 숫자를 쓰게되면 그 길이 만큼의 입력을 받게 된다. 매우 편한 트릭이다. 공백 없이 들어오는 큰 수를 자리수 마다 따로 받을 수 있다.
N개씩 끊어 출력하기
scanf("%10s", );
%s의 경우도 개수를 지정해서 입력 받을 수 있다. 만약 입력받을 수 있는 개수가 지정한 개수보다 작으면 그만큼만 입력 받게 된다.
기타 트릭
scanf("%d %*d %d", &x, &y);
*을 앞에다 붙이게 되면 입력을 받지만 변수에 저장을 하지 않는다.