2008년 1월 30일 수요일

추억4. 컴퓨터 경진대회 참가

초등학교 다닐 때 컴퓨터 경진대회 도예선에 참가하게 되었습니다.

도예선을 통과하면 전국대회에 갈 수 있으니, 어린 마음에 엄청 기대를 하고 갔습니다.

사용자 삽입 이미지

MSX BASIC 실행화면입니다

당시 필기시험은 없고, 실기시험만 있었는데, BASIC을 이용해서 주어진 5 문제를 해결하면 되는 형식이었습니다.


(요즘 정보처리 관련 자격증 시험 보면 문제은행 달달 외면 되는 필기시험으로 도배되어 있는데, 차라리 이 때의 시험이 더 나았다고 봅니다)

당시 처음 배웠던, 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: }

지금 보면 별 것 아닌 개념이지만, 당시에 초등학생이 이해하기에는 너무 복잡한 개념이었습니다.

정렬도 겨우 이해해서 짜는 마당에  저런 대각선 방향 출력이라니요…
(당시에는 문제 자체를 이해하지 못했습니다)

시험 감독관 선생님께서 보기에 답답하셨는지, 다른 것은 다 맞는데 이것만 틀렸으니까 다시 풀어보라고 친절하게 말씀해주시는 바람에 이 문제만 틀린 것은 알게 됐는데, 당시에는 왜 틀렸는지 몰랐습니다.

게다가 왜 정렬한 뒤에 이런 (쓸데없는!) 형태로 출력하는지도 몰랐고요.
그러다, 좀 더 철이 들고 공부를 하고 나서야 저 출력의 의미를 깨달을 수 있었습니다.

MPEG1에서 데이터 압축시 64개의 데이터를 저런 순서로 나열해서 FFT 연산을 수행합니다)

결국, 이 문제를 풀지 못해 도예선을 통과하지 못하고, 일장춘몽으로 끝나고 말았습니다. 휴~


덧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 문제였는지는 확실하지 않습니다. 대략의 기억입니다. 어쨌든, 저 문제 외에는 다 풀었습니다.
       감독관 선생님께서 분명히 말씀해주셨습니다. ^^;;;

덧3. 이 글은 Windows Live Writer로 작성해봤습니다. 코드 입력은 Code Snippet plugin을 사용했구요.





댓글 4개:

  1. 역시 대단하십니다..

    저는 경진대회는 고사하고 컴터학원을 게임때문에 다녔거든요.

    목요일인가, 금요일마다 게임 복사해준다고 해서 다른 학원으로 막 옮겨다니기도 하고요ㅋ.ㅋ;

    답글삭제
  2. @w0rm9 - 2008/01/30 07:33
    게임... 당시 학원을 선택하는 가장 중요한 이유 중 하나였지요... ^^;;;

    답글삭제
  3. 와우...대단하시네요...

    어릴적 베이직을 배운게 전부였는데...



    그때부터 컴퓨터에 흥미를 가지기 시작했었죠....^^

    답글삭제
  4. @비퍼플 - 2008/01/30 17:35
    많은 사람들에게 BASIC은 언어 자체의 가치 이상의 무언가가 있는 것 같습니다.

    추억같은 것 말이죠...

    답글삭제