초등학교 다닐 때 컴퓨터 경진대회 도예선에 참가하게 되었습니다.
도예선을 통과하면 전국대회에 갈 수 있으니, 어린 마음에 엄청 기대를 하고 갔습니다.
MSX BASIC 실행화면입니다
(요즘 정보처리 관련 자격증 시험 보면 문제은행 달달 외면 되는 필기시험으로 도배되어 있는데, 차라리 이 때의 시험이 더 나았다고 봅니다)
당시 처음 배웠던, 1부터 n까지의 합을 구하는 비장의 공식인
S = n(n+1)/2 까지 동원해가며 4 문제를 성공적으로 풀었습니다.
마지막 5번 문제는 16개의 난수를 생성한 뒤에 이를 오름차순으로 정렬하고 나서 대각선 방향으로 배열해서 출력하는 문제였습니다.
즉, 난수를 생성, 정렬한 뒤에 아래와 같은 순서로 출력하면 되는 것입니다.
1 | 2 | 4 | 7 |
3 | 5 | 8 | 11 |
6 | 9 | 12 | 14 |
10 | 13 | 15 | 16 |
이 코드를 C로 작성하면 아래와 같이 됩니다.
sort는 비겁하게 내장 quick sort 알고리즘을 사용했습니다.
1: #include <stdio.h>
2: #include <stdlib.h>
3: #include <time.h>
4:
5: #define COUNT 16
6:
7: int icompare( const void *arg1, const void *arg2 )
8: {
9: return *(int *)arg1 - *(int *)arg2;
10: }
11:
12: int main(int argc, char* argv[])
13: {
14: srand( (unsigned)time( NULL ) );
15:
16: int randoms[COUNT];
17: int i;
18:
19: // 16개의 난수 생성
20: for (i=0; i<COUNT; i++)
21: {
22: randoms[i] = rand() % 100;
23: }
24:
25: //정렬
26: qsort((void*)randoms, COUNT, sizeof(int), icompare);
27:
28: //출력
29: const int CROSS[] = {
30: 0, 1, 3, 6,
31: 2, 4, 7, 10,
32: 5, 8, 11, 13,
33: 9, 12, 14, 15
34: };
35:
36: for (i=0; i<COUNT; i++)
37: {
38: printf("%02d ", randoms[CROSS[i]]);
39: if ((i & 3) == 3) printf("\n");
40: }
41:
42: return 0;
43: }
지금 보면 별 것 아닌 개념이지만, 당시에 초등학생이 이해하기에는 너무 복잡한 개념이었습니다.
정렬도 겨우 이해해서 짜는 마당에 저런 대각선 방향 출력이라니요…
(당시에는 문제 자체를 이해하지 못했습니다)
시험 감독관 선생님께서 보기에 답답하셨는지, 다른 것은 다 맞는데 이것만 틀렸으니까 다시 풀어보라고 친절하게 말씀해주시는 바람에 이 문제만 틀린 것은 알게 됐는데, 당시에는 왜 틀렸는지 몰랐습니다.
게다가 왜 정렬한 뒤에 이런 (쓸데없는!) 형태로 출력하는지도 몰랐고요.
그러다, 좀 더 철이 들고 공부를 하고 나서야 저 출력의 의미를 깨달을 수 있었습니다.
결국, 이 문제를 풀지 못해 도예선을 통과하지 못하고, 일장춘몽으로 끝나고 말았습니다. 휴~
덧1. 지금 저 코드를 BASIC으로 작성하지는 못하겠고, 그 때의 기분을 느껴본다는 생각으로 내장 quick sort 대신 bubble sort를 작성해서 끼워넣어봤습니다. 아래와 같습니다.
1: #include <stdio.h>
2: #include <stdlib.h>
3: #include <time.h>
4:
5: #define COUNT 16
6:
7: int main(int argc, char* argv[])
8: {
9: srand( (unsigned)time( NULL ) );
10:
11: int randoms[COUNT];
12: int i;
13:
14: // 16개의 난수 생성
15: for (i=0; i<COUNT; i++)
16: {
17: randoms[i] = rand() % 100;
18: }
19:
20: //정렬
21: int count = COUNT;
22: bool swapped;
23: do
24: {
25: count--;
26: swapped=false;
27: for (i=0; i<count; i++)
28: {
29: if (randoms[i]>randoms[i+1])
30: {
31: randoms[i]^=randoms[i+1]^=randoms[i]^=randoms[i+1];
32: swapped=true;
33: }
34: }
35: } while(swapped);
36:
37: //출력
38: const int CROSS[] = {
39: 0, 1, 3, 6,
40: 2, 4, 7, 10,
41: 5, 8, 11, 13,
42: 9, 12, 14, 15
43: };
44:
45: for (i=0; i<COUNT; i++)
46: {
47: printf("%02d ", randoms[CROSS[i]]);
48: if ((i & 3) == 3) printf("\n");
49: }
50:
51: return 0;
52: }
덧2. 문제가 5 문제였는지는 확실하지 않습니다. 대략의 기억입니다. 어쨌든, 저 문제 외에는 다 풀었습니다.
감독관 선생님께서 분명히 말씀해주셨습니다. ^^;;;
역시 대단하십니다..
답글삭제저는 경진대회는 고사하고 컴터학원을 게임때문에 다녔거든요.
목요일인가, 금요일마다 게임 복사해준다고 해서 다른 학원으로 막 옮겨다니기도 하고요ㅋ.ㅋ;
@w0rm9 - 2008/01/30 07:33
답글삭제게임... 당시 학원을 선택하는 가장 중요한 이유 중 하나였지요... ^^;;;
와우...대단하시네요...
답글삭제어릴적 베이직을 배운게 전부였는데...
그때부터 컴퓨터에 흥미를 가지기 시작했었죠....^^
@비퍼플 - 2008/01/30 17:35
답글삭제많은 사람들에게 BASIC은 언어 자체의 가치 이상의 무언가가 있는 것 같습니다.
추억같은 것 말이죠...