코드 길이를 줄이는 방법

H9 ㅎㅇ!
ps를 한 기간이 꽤 되는 사람이라면, 문제를 푼 후 소스코드의 길이가 남들에 비해 월등히 우람하고 큼직해 현자타임을 느낀 적이 있을 것이다.
바로 이렇게 말이다.

그렇다면, 코드를 줄이는 방법이 필요하지 않겠는가? 간단한 것부터 시작해 몇 가지 알아보도록 하자. (대부분의 온라인저지 C 컴파일러는 GCC를 사용하므로 GCC를 기준으로 서술한다. 이외의 컴파일러에서는 실행되지 않는 것이 다수 존재할 수 있으므로 참고하자. 또한, 이 글은 YunGoon님의 숏코딩 관련 자료를 참고하여 작성하였다.)

C언어를 사용해 #include를 생략하자.

C언어를 사용하면 생략할 수 있는 문장이 여럿 생기는데, 이를 활용해 숏코딩을 할 때는 보통 다음과 같은 꼴을 기본형태로 사용한다.

x;y;main(q,w,e){...}

위의 기본형태는 다음과 같은 특징을 활용하였다.
- 표준헤더의 include문이 생략 가능하다
- 전역 int형 변수 / 반환형이 int형인 함수의 경우 int를 생략할 수 있다.

while 사용을 자제하자.

while 대신 for을 사용하는 습관을 들이자.
while은 조건문만을 괄호 안에 포함할 수 있지만, for은 초기화식과 증감식을 사용자의 목적에 따라 생략 혹은 작성할 수 있다. 반복문 내부의 코드가 줄어들어 한 줄이 된다면 중괄호를 생략할 수 있다는 엄청난 이점이 생긴다.

while(x){printf("%d",x);x/=2;}
for(;x;x/=2)printf("%d",x);

연산자를 활용하자.

정수 나눗셈을 활용하거나, 곱셈에서의 강제형변환, 비트연산자 등을 활용하면 코드 길이를 효과적으로 감소시킬 수 있다.
자세한 건 예시를 통해 확인하자.

for(;a<=b;)
for(;b/a;)

(double)x/y
1.0*x/y
1.*x/y

(long long)p
1ll*p
1l*p

for(;a!=b;)
for(;a^b;)

for(;;){
    if(scanf("%d",&n)==0)break;
    ...
}
for(;~scanf("%d",&n);){
    ...
}

x*(n+1)
x*-~n

x*(n-1)
x*~-n

if(p&&q)
if(p&q)

if(p||q)
if(p|q)

if(x<2)puts("!");
x<2&&puts("!");

if(!x)puts("@");
x||puts("@");