심심해서 써보는 숏코딩 할 때의 의식의 흐름

별찍기 20번 문제의 숏코딩을 하고 싶어졌습니다.

일단 숏코딩 할 여지가 있도록 코드를 짜 봅니다.

(※비트연산자에 대한 간단한 지식이 필요합니다.)

int i, j, n;
int main() {
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        for(j = 0; j < 2 * n + (i & 1); j++)
            putchar((i + j) & 1 ? 32 : 42);
        puts("");
    }
}

전역변수와 함수 선언부의 int는 생략해도 무방합니다.

그리고 n을 main함수의 argc 자리에 넣으면 콤마 하나를 절약할 수 있습니다.

i, j;
main(n) {

전역 변수는 0으로 초기화 되니 i의 초기화문을 삭제할 수 있습니다.

또한 scanf구문을 for문의 초기식에 넣을 수 있습니다.

for(scanf("%d", &n); i < n; i++) {

for문이 끝날 때 마다 puts("")가 실행되니, 이를 for문의 반복식에 넣으면 중괄호를 없앨 수 있습니다.

또한, i++를 조건문에 합쳐 봅니다.

for(scanf("%d", &n); i++ < n; puts(""))

이렇게 되면 하위 반복문에 진입할 때 i가 이미 증가한 상태로 진입하게 되므로 i의 기우성이 바뀌게 됩니다.

이를 수정해 줍시다.

for(j = 0; j < 2 * n - (i & 1); j++)
    putchar((i + j) & 1 ? 42 : 32);

j++는 putchar() 구문에 있는 j와 합칠 수 있습니다.

for(j = 0; j < 2 * n - (i & 1);)
    putchar((i + j++) & 1 ? 42 : 32);

엔터와 띄어쓰기를 모두 지워 줍시다.

i,j;main(n){for(scanf("%d",&n);i++<n;puts(""))for(j=0;j<2*n-(i&1);)putchar((i+j++)&1?42:32);}

93바이트가 나왔는데, 아직 더 줄일 여지가 있어 보입니다.

j를 매번 새로 갱신하는 식이 보기가 싫어서 바꾸고 싶습니다.

puts("")의 return 값은 1입니다.

이를 이용해서 수정해 봅시다.

i,n;
main(j){
    for(scanf("%d",&n);i++<n;j=puts(""))
        for(;j<2*n+(~i&1);)
            putchar((i+j++)&1?32:42);
}

j = puts("")를 반복식으로 넣으면 j는 2번째 루프부터는 계속 1로 초기화가 됩니다.

하지만 초기값이 0이므로 이를 예외처리하면 골치가 아파질 것 같습니다.

그렇지만 우리는 일반적인 실행 환경에서의 argc의 값은 1이라는 것을 알고 있습니다!

main의 인자에 n 대신 j를 넣어 1로 초기화해 주고, 이에 영향을 받은 식들의 기우성을 따져 수정해 줍시다.

i 앞에 비트 NOT 연산자를 추가해 기우성을 바꾸고, putchar 식의 삼항 연산자 값의 순서를 바꿔 주었습니다.

&연산자의 우선순위는 매우 낮아 덧셈보다 뒤입니다.

때문에 두 번째 for문의 조건식에 계속 괄호를 써야 했습니다.

그런데 굳이 나대면서 비트 연산자를 쓰지 않고 % 연산자를 쓰면 해결될 거라는 것을 뒤늦게 깨닫습니다.

수정해 봅니다.

i,n;
main(j){
    for(scanf("%d",&n);i++<n;j=puts(""))
        for(;j<2*n-~i%2;)
            putchar((i+j++)&1?32:42);
}

줄이면 91바이트가 나옵니다.

생각해보니 &연산자의 우선순위가 낮아서 putchar에 있는 (i+j++)의 괄호를 없애도 될 것 같습니다.

i,n;
main(j){
    for(scanf("%d",&n);i++<n;j=puts(""))
        for(;j<2*n-~i%2;)
            putchar(i+j++&1?32:42);
}
i,n;main(j){for(scanf("%d",&n);i++<n;j=puts(""))for(;j<2*n-~i%2;)putchar(i+j++&1?32:42);}

총 89바이트로 마무리가 되었습니다.

일단 제 눈에는 더 줄일 여지가 보이지 않습니다.

이렇게 또 자기만족을 해 봅니다.

의식의 흐름대로 쓴 글이라 가독성은 폭망입니다. 양해해 주시길

게다가 개행이 원하는 대로 안 나오는 게 꽤나 불편하네요ㅜㅜ 원래 개행 여러 번 해서 그나마 없는 가독성이라도 살려 보려 했는데..


댓글 (6개) 댓글 쓰기


baekjoon 7년 전

<br> 쓰세요


kyma123 7년 전

헉 그런 방법이


yukariko 7년 전

저는 j변수를 삭제하니 더 줄어들었습니다. doju님의 코드도 그렇고 다들 신기하네요


kyma123 7년 전

zzzzz그냥 심심해서 올려봤는데 순식간에 10바이트가 줄었네요 무서워요ㅋㅋㅋㅋㅋ


skynet 7년 전

의식의 흐름 ㅋㅋㅋㅋㅋ