알고리즘 스킬 강의 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);

*을 앞에다 붙이게 되면 입력을 받지만 변수에 저장을 하지 않는다.

results matching ""

    No results matching ""