-
저번에 타고난혀님께서 컴퓨터 프로그래밍에 열정이 많으신 것 같아서 제가 최근에 접한 흥미로운 프로그래밍 문제를 같이 공유해볼까 해서 글 올립니다.
혹시 별로 흥미없으시면 얘기해주세요. ^^ 이 문제는 제가 인터뷰 본 회사에서 가져온 문제입니다. 일단 전 프로그램 끝내고 보냈고요. 절대 다른 분의 도움을 받고자 하는것이 아닌 순수히 재미를 위해서 문제를 올립니다. 관심있으신분들도 한번 생각해보시면 재밌을거 같네요. ^^The problem is to write a set of functions to manage a variable number of byte queues, each with variable length, in a small, fixed amount of memory. You should provide implementations of the following four functions:
Q * createQ(); //Creates a FIFO byte queue, returning a handle to it.
void destroyQ(Q * q); //Destroy an earlier created byte queue.
void enQ(Q * q, unsigned char b); //Adds a new byte to a queue.
unsigned char deQ(Q * q); //Pops the next byte off the FIFO queue.So, the output from the following set of calls:
Q * q0 = createQ();
enQ(q0, 0);
enQ(q0, 1);
Q * q1 = createQ();
enQ(q1, 3);
enQ(q0, 2);
enQ(q1, 4);
printf(“%d”, deQ(q0));
printf(“%d\n”, deQ(q0));
enQ(q0, 5);
enQ(q1, 6);
printf(“%d”, deQ(q0));
printf(“%d\n”, deQ(q0));
destroyQ(q0);
printf(“%d”, deQ(q1));
printf(“%d”, deQ(q1));
printf(“%d\n”, deQ(q1));
destroyQ(q1);should be:
0 1
2 5
3 4 6You can define the type Q to be whatever you want.
Your code is not allowed to call malloc() or other heap management routines. Instead, all storage (other than local variables in your functions) should be done in a provided array:
unsigned char data[2048];
Memory efficiency is important. On average while your system is running, there will be a dozen or so queues with an average of 80 or so bytes in each queue. Your functions may be asked to create a larger number of queues with less bytes in each. Your functions may be asked to create a smaller number of queues with more bytes in each.
If you are unable to satisfy a request due to lack of memory, your code should call a provided failure function, which will not return:
void onOutOfMemory();
If the caller makes an illegal request, like attempting to deQ a byte from an empty queue, your code should call a provided failure function, which will not return:
void onIllegalOperation();
Worst-case performance when adding and removing bytes is more important than average-case performance.
There may be spikes in the number of queues allocated, or in the size of an individual queue. Your code should not assume a maximum number of bytes in a queue (other than that imposed by the total amount of memory available, of course!) You can assume that no more than 64 queues will be created at once.