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;
}
전광판 문제
#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;
}
사원 평점
#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)");
}
}
🥇 소감
이번 대회에서 1위 수상받게 되어 다소 당황했다.
그럴 만도 한 것이, 교수님께서 프로그래밍 과제 평가하는 시간에 개인적으로 과제를 잘해 온 학생, 실력 뛰어난 학생이 몇 명있었다. 심지어 교수님께서도 좋게 평가해주셨다. 그러니 나는 이 상황을 미루어 볼 때 1위는 아니어도 순위권 끝자락에 들 수 있을 것 같았다.
그런데도 1위 수상받았다.
대회 준비할 때 교재 처음부터 읽으면서 교재 문제를 풀었다고 앞에 서술한 적이 있는데, Deep dive 정도는 아니고 개념 정리만 했다. 문제 해결하는 데 개념만 이해해둬도 문제 없으니까.
그래서 나는 이 대회에서 수상한 것을 단순히 운이 좋았다고 생각하지 않기로 했다. 다음 대회에 참가할 때 '제발! 이번에도 1등하게 해주소서!'라고 생각할 수도 있으니까.
대신에 프로그래밍에 흥미를 가지고 복습을 열심히 한 것이 좋은 결과로 이어졌다고 본다. 기본에 충실하며, 경험 그리고 도전이 나의 길을 직접 만들어 간다는 것을 여기서 배웠다.
Top comments (0)