DEV Community

함승우
함승우

Posted on

삼육대 프로그래밍 경진대회 참가 소감

제3회 프로그래밍 경진대회 포스트

1학년 학생들을 대상으로 하는 삼육대학교 교내 대회가 개최되었다. C언어 기초 문법과 알고리즘 능력으로 겨루며, 3개의 문제와 1시간 30분이라는 제한 시간이 주어진다.

그리고 Microsoft Visual Studio 사용하여 프로그래밍한다.

🤔 참가 동기

나는 처음에는 대회 참가를 크게 고려하지 않았다. 참가했다가 순위권에 들지 못하면 정말 슬퍼했을 것이다. 애초 성격은 그리 도전적이지 않았고, 작은 돌맹이 하나 던지면 쉽게 깨질 것 같은 유리였다.

그런 성격을 지닌 내가 참가하게 된 계기는 프로그래밍 교수님 때문이었다.

학기 중 진행된 프로그래밍 수업에서 2인 1조로 진행한 과제에서 구현한 미니 게임을 보고 교수님께서 놀라워하셨다. 그때 교수님은 나의 능력에 대해 인식하신 듯 했다. 수업이 끝날 무렵 교수님께서 나를 보며 대회에 참가하는 걸 고려해보라고 하셨다.

✨ 준비 과정

기본에 충실하게 공부하며 대회 준비했다. 대회가 어떤 유형으로 나올지 모르기에, 전공 교재를 처음부터 다시 훑으며 부족한 부분을 중점적으로 복습했다.

그 외에는 인터넷 자료를 활용해 추가 정보를 찾아서 공부하거나, 교수님께 질문 쪽지를 드려보기도 했다.

💻 대회

대회 당일, 3개의 문제가 주어졌다. 그 중에서 두 번째 문제(전광판)가 어려웠다.

숫자 모양을 일일이 배열에 추가하는 무식한 방법을 썼다. 과거 아두이노 가지고 LED 핀을 꽂아두고 코드를 일일이 작성했던 것이 떠올랐다.

요금제 문제

문제: 고객들 중 가장 높은 요금 비용을 출력할 것

내용: 기본 요금, 일반 통화 시간 * 50, 할인 통화 시간 * 25


#include <stdio.h>

int main(void) {
    int Count = 0;
    printf("몇 명입니까? : ");
    scanf_s("%d", &Count);

    int User[999][4];


    printf("기본요금, 일반통화시간, 할인통화시간: \n");
    for (int i = 0; i < Count; i++) {
        scanf_s("%d %d %d", &User[i][0], &User[i][1], &User[i][2]);
        User[i][3] = User[i][0] + User[i][1] * 50 + User[i][2] * 25;
    }

    int price_MAX = 0;
    int num = 0;
    int sum = 0;
    for (int i = 0; i < Count; i++) {
        if (User[i][3] > price_MAX) {
            price_MAX = User[i][3];
            num = i + 1;
            sum = User[i][1] + User[i][2];
        }
    }

    printf("최고요금 고객 %d의 통화요금= %d원이고, 총 통화시간= %d분", num, price_MAX, sum);
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

문제 1 화면

전광판 문제

#include <stdio.h>

char nine[5][3] = {
'|','-','|',
'|',' ','|',
'|','-','|',
' ',' ','|',
' ',' ','|'
};
char eight[5][3] = {
'|','-','|',
'|',' ','|',
'|','-','|',
'|',' ','|',
'|','-','|'
};
// ... 0-7

int main(void) {
    int num;
    printf("정수 입력하세요: ");
    scanf_s("%d", &num);

    if (num > 10000 || num < 0) {
        printf("정수가 너무 크거나 작습니다. 최대 9999, 최소 0");
        return 1;
    }

    int n_one = num / 1000;
    int n_two = num / 100 - ((num / 1000) * 10);
    int n_three = (num / 10) % 10;
    int n_four = num % 10;

    const int WIDTH = 4 * 4 + 1;
    const int HEIGHT = 5;

    char LEDArray[HEIGHT][WIDTH] = { 0 };

    int numarr[4] = { n_one, n_two, n_three, n_four };
    int numnum = 0, i = 0, j = 0;
    for (int k = 0; k < 4;k++) {
        numnum = k * 4;
        switch (numarr[k]) {
        case (0):
            //if (n_one == 0) break;
            //else if (n_one == 0 && n_two == 0) break;
            //else if (n_one == 0 && n_two == 0 && n_three == 0) break;
            // else if (n_one == 0 && n_two == 0 && n_three == 0 && n_four == 0) break;

            for ( i = 0; i < 5; i++) {
                for ( j = 0; j < 3; j++) {
                    LEDArray[i][numnum + j] = zero[i][j];
                    //printf("%c ", zero[i][j]);
                }
            } break;
        case (1):
            for ( i = 0; i < 5; i++) {
                for ( j = 0; j < 3; j++) {
                    LEDArray[i][numnum + j] = one[i][j];
                    //printf("%c ", one[i][j]);
                }
            } break;
        // case 2 ... 9
        }
        LEDArray[0][numnum + j + 1] = ' ';
        LEDArray[1][numnum + j + 1] = ' ';
        LEDArray[2][numnum + j + 1] = ' ';
        LEDArray[3][numnum + j + 1] = ' ';
        LEDArray[4][numnum + j + 1] = ' ';
    }

    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf("%c ", LEDArray[i][j]);
        }
        printf("\n");
    }
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

문제 2 화면

사원 평점

#include <stdio.h>
#include <string.h>

struct USER {
    char num[100] = { 0 };
    char name[100] = { 0 };
    float major = 0;
    float two = 0;
    float three = 0;

    char score[100] = { 0 };
    float avg = 0;
    float sum = 0;
};

void function(float *sum, float *avg, char *,struct USER);

int main(void) {
    struct USER user[5];

    for (int i = 0; i < 5; i++) {
        printf("%d번째 사번, 사원명, 전문지식, 관리능력, 업무태도를 입력하세요: ", i + 1);
        scanf_s("%s %s %f %f %f", user[i].num, sizeof(user[i].num), user[i].name, sizeof(user[i].name), &user[i].major, &user[i].two, &user[i].three);
        function(&user[i].sum, &user[i].avg, user[i].score, user[i]);
    }

    for (int i = 0; i < 5; i++) {
        struct USER temp;
        for (int j = 0; j < 5 - 1 - i; j++) {
            if (user[j].avg < user[j + 1].avg) {
                temp = user[j];
                user[j] = user[j + 1];
                user[j + 1] = temp;
            }
        }
    }
    printf("석차\t사번\t사원명\t전문지식\t관리능력\t업무태도\t합계\t평균\t등급\n");
    for (int i = 0; i < 5; i++) {
        printf("%d\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\t%s\n", i + 1, user[i].num, user[i].name, user[i].major, user[i].two, user[i].three, user[i].sum, user[i].avg, user[i].score);
    }

    return 0;
}
void function(float *sum, float *avg, char * score,struct USER user) {
    *sum += user.major;
    *sum += user.two;
    *sum += user.three;

    *avg = (user.major + user.two + user.three) / 3;

    if (*avg >= 9) {
        strcpy_s(score, 100, "에스(S)");
    }
    else if (*avg >= 7 && *avg <= 9) {
        strcpy_s(score, 100, "에이(A)");
    }
    else if (*avg >= 5 && *avg <= 7) {
        strcpy_s(score, 100, "비(B)");
    }
    else {
        strcpy_s(score, 100, "씨(C)");
    }
}
Enter fullscreen mode Exit fullscreen mode

문제 3 화면

🥇 소감

이번 대회에서 1위 수상받게 되어 다소 당황했다.

그럴 만도 한 것이, 교수님께서 프로그래밍 과제 평가하는 시간에 개인적으로 과제를 잘해 온 학생, 실력 뛰어난 학생이 몇 명있었다. 심지어 교수님께서도 좋게 평가해주셨다. 그러니 나는 이 상황을 미루어 볼 때 1위는 아니어도 순위권 끝자락에 들 수 있을 것 같았다.

그런데도 1위 수상받았다.

대회 준비할 때 교재 처음부터 읽으면서 교재 문제를 풀었다고 앞에 서술한 적이 있는데, Deep dive 정도는 아니고 개념 정리만 했다. 문제 해결하는 데 개념만 이해해둬도 문제 없으니까.

그래서 나는 이 대회에서 수상한 것을 단순히 운이 좋았다고 생각하지 않기로 했다. 다음 대회에 참가할 때 '제발! 이번에도 1등하게 해주소서!'라고 생각할 수도 있으니까.

대신에 프로그래밍에 흥미를 가지고 복습을 열심히 한 것이 좋은 결과로 이어졌다고 본다. 기본에 충실하며, 경험 그리고 도전이 나의 길을 직접 만들어 간다는 것을 여기서 배웠다.

Top comments (0)