숏코딩에서는 함수 반환값을 이용한 테크닉을 많이 쓴다.
이 글에서는 함수의 반환값을 이용해 길이를 줄이는 테크닉을 소개하려고 한다.

들어가기 전에

일단 숏코딩할 때는 #include 같은 구질구질한 거 쓰지 않는다.
안 쓰고도 printf(), sqrt() 같은 거 잘 쓸 수 있다.
gcc만 되는건지, 온라인 저지들의 옵션만 되는 건지, 정확한 이유는 모르고 된다는 것만 안다.
그러니 개발같은 거 할 때는 저런짓 할 생각도 하지 마라.
아 물론 그냥 ps할 때 하더라도 처맞는다. 숏코딩할 때만 해라.
그냥 숏코딩할 때 하는 짓들은 대부분 다른 곳에서 하면 처맞는다.

파일 끝날 때까지 입력받기

이건 숏코딩 할 때 아니여도 편해서 종종 쓴다.

while(~scanf("%d",&n))printf("%d",n);

scanf_return

scanf()의 반환값을 이용한다. return value에서 scanf, fscanf 등의 반환값을 한 번에 설명하는데 scanf는 1)이다.
성공적으로 입력받은 인자의 개수를, 첫 번째 인자를 받기도 전에 input failure이 일어나면 EOF를 반환한다.

  • 파일의 끝에서 scanf()가 EOF 반환
  • EOF = -1
  • -1 은 이진수 상으로 111...1(2)
  • 111...1(2) 의 bit not 은 000...0(2)
  • 000...0(2) = 0
    의 과정을 거쳐 while문은 파일이 끝날 때까지 입력을 받게 된다.
    *참고로 실제 숏코딩에서는 while() 대신 for(;;) 쓴다.

입력 받자마자 출력하기

한 줄을 입력받아서 그대로 출력하는 코드를 짜보자.

scanf("%s",s);printf("%s",s);

문자열 전용 입출력 함수를 쓰면 더 줄일 수 있다.

gets(s);puts(s);

많이 줄었다. 근데 사실 더 줄일 수 있다.

puts(gets(s));

puts()의 인자로 gets()를 그냥 넣어버렸다. 이게 어떻게 가능한 걸까?

gets_return

gets()는 성공시 그냥 인자로 들어온 주소를 return한다.
puts()의 인자는 출력할 주소기 때문에 그냥 저렇게 쓰면 된다.

비슷한 원리로

printf("%d",atoi(gets(s)));

이런 것도 가능하다.

ps1

if(strcmp(s, t) == -1) {
    /*do anything...*/
}

strcmp()의 반환값은 -1, 0, 1이 아니라 <0, 0, >0 이다.
위처럼 짰다가 한참 개고생할 수 있다.
(실제로 나는 저것 때문에 코드업에서 프린트 디버깅으로 한 시간 넘게 고생한 적이 있다.)
그러니 함수의 반환값은 숏코딩이 아니더라도 잘 알아두자.

ps2

__builtin_popcount(n)     //n을 이진수로 나타냈을 때, 1의 개수

c, c++에 생각보다 쓸모있는 함수 많다. 저런 거 잘 쓰면 생각보다 되게 편하다.
자주 쓰이는 거 몇 개 정도는 기억해두자.