U E D R , A S I H C RSS

토이/삼각형만들기/김남훈

아이디어랄까.

첫번째와 두번째는 너무 쉽다. 버퍼만 만들면 거기에 별표만 채우면 되니까. 오히려 makeBuffer 함수가 신경써야 할 부분. C 에서는 문자열의 끝을 신경써줘야 하니까.

세번째가 결국 문제인데, 무슨 수열 생각할 거 없이 그저 직관적으로 recursive로 필요한 버퍼의 양을 구현. 이건 별표 찍는 시작 위치 정할때도 쓸수 있더구만. 그저 가는대로 프로그래밍 했을 뿐.

다만 걱정되는게 있었다면, visual studio 띄우기도 귀찮아서.. 그리고 요즘에는 이런거 짜는데 마소 비주얼 스튜디오 형님까지 끌어들이는건 좀 미안하게 느껴져서 그냥 zp server 에서 vi 로 두들겼는데.. 나 gdb 쓸 줄 모르니까. malloc 쓰면서 약간 두려웠지. 흐흐흐. 다행이 const int 를 case 에서 받을 수 없는거 (이런 줄 오늘 알았다) 말고는 별달리 에러 없이 한방에 되주셔서 즐거웠지.

시험도 끝났으니 이런거나 하면서 놀면 재밌겠다. 다른 문제 없나...


#include <stdio.h>
#include <stdlib.h>

#define FORWARD 1
#define BACKWARD 2
#define BIDIR 3

void getUserInput(int * sel, int * num) {
        scanf("%d %d", sel, num);
}

char * makeBuffer(int num) {
        char * ret = (char *)malloc(sizeof(char) * num + 1);

        ret[num--] = '\0';

        while (num >= 0)
                ret[num--] = ' ';

        return ret;
}

void forwardTriangle(int num, char * buffer) {
        int i;

        for (i = 0; i < num; i++) {
                buffer[i] = '*';
                printf("%s\n", buffer);
        }
}

void backwardTriangle(int num, char * buffer) {
        int i;

        for (i = num - 1; i >= 0; i--) {
                buffer[i] = '*';
                printf("%s\n", buffer);
        }
}

int calcBidirTriangleSize(int num) {
        if (num == 1)
                return 1;

        return calcBidirTriangleSize(num - 1) + 2;
}

void bidirTriangle(int num, char * buffer) {
        int i, center;
        center = calcBidirTriangleSize(num) / 2;

        for (i = 0; i < num; i++) {
                buffer[center + i] = '*';
                buffer[center - i] = '*';
                printf("%s\n", buffer);
        }
}

void produceTriangle(int sel, int num) {
        char * buffer;

        switch (sel) {
        case FORWARD:
                buffer = makeBuffer(num);
                forwardTriangle(num, buffer);
                break;
        case BACKWARD:
                buffer = makeBuffer(num);
                backwardTriangle(num, buffer);
                break;
        case BIDIR:
                buffer = makeBuffer( calcBidirTriangleSize(num) );
                bidirTriangle(num, buffer);
        }

        free(buffer);
}

int main(void) {
        int sel, num;

        getUserInput(&sel, &num);
        produceTriangle(sel, num);

        return 0;
}

아 요즘 왜이리 심심할까..

토이 토이/삼각형만들기
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:21
Processing time 0.0123 sec