코드 길이를 줄이는 방법
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("@");