원본: http://archive.is/nRTcI

원형큐에서 가져와서 처리하는 문제임.

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include


#define MAX_QUEUE_SIZE 30 // 창고의 크기(얼마나 컴퓨터를 받을 수 있는가) / 임의로 30으로 설정하였음

#define MAX_REPAIR 3 // 동시에 3개를 다룰 수 있음


typedef struct {

 int id; // 컴퓨터에게 번호를 붙여줌

 int arrival_time; // 컴퓨터를 의뢰받는 날짜

 int service_time; // 컴퓨터 수리에 걸리는 시간

 int status; // 컴퓨터의 수리가 끝났는지 체크하는 변수. 1이면 수리완료 0이면 수리중

}element; // 컴퓨터 정보

typedef struct {

 int front;

 int rear;

 element data[MAX_QUEUE_SIZE]; // 창고 안의 컴퓨터들(data[창고크기])

}Qtype; // 대기창고


// 창고 구현을 위한 원형큐 함수들

void error(char* message) {

 fprintf(stderr, "%s\n", message);

 exit(1);

}

void init_queue(Qtype* q) {

 q->front = q->rear = 0;

}

int is_empty(Qtype* q) {

 return (q->front == q->rear);

}

int is_full(Qtype* q) {

 return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);

}

void enqueue(Qtype* q, element item) {

 if (is_full(q))

  error("창고가 포화상태입니다.");

 q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;

 q->data[q->rear] = item;

}

element dequeue(Qtype* q) {

 if (is_empty(q))

  error("창고가 공백 상태입니다.");

 q->front = (q->front + 1) % MAX_QUEUE_SIZE;

 return q->data[q->front];

}

element peek(Qtype* q) {

 if (is_empty(q)) 

  error("창고가 공백 상태입니다");

 return q->data[q->rear];

}

void init_cpt(element computer) {

 computer.id = 0;

 computer.arrival_time = 0;

 computer.service_time = 0;

 computer.status = -1;

}


int main() {

 int End_day = 10;

 int pay_total = 0;  // 보수

 int Num_computer = 0; 

 int service_time = 0;

 int check_new = 0; // 새로운 컴퓨터 수리 의뢰가 들어왔는지 확인하기 위한 변수 선언

 int total_computers = 0;  // 총 컴퓨터 대수



 element computer[MAX_REPAIR] = { 0, }; // 동시에 3대를 수리할 수 있음

 element finished_computer[MAX_REPAIR] = { 0, }; // 수리가 끝난 컴퓨터를 모아놓는 곳


 Qtype warehouse; // warehouse라는 대기창고 생성

 init_queue(&warehouse); // 창고 초기화

 srand(time(NULL)); //


 for (int i = 0; i

  computer[i].id = Num_computer++; // 컴퓨터번호 1증가

  computer[i].arrival_time = 0; //  그냥 0으로 가정하였음

  computer[i].service_time = rand() % 7 + 1; // 1~7일 소요

  computer[i].status = 0;

 }


 for (int day = 1; day <= End_day; day++) { //1일차 부터 End_day까지

  printf("\t\t    - %d일차 -\n\n", day);

  if (rand()

   check_new += 1;

   element new_computer;

   new_computer.id = Num_computer++;

   new_computer.arrival_time = day;

   new_computer.service_time = rand() % 7 + 1;

   new_computer.status = 0;

   enqueue(&warehouse, new_computer);

  }

  printf("-------------------수리현황판-------------------\n\n");

  for (int i = 0; i

  {

   if (computer[i].status == 1) {

    finished_computer[i] = computer[i];

    if (!is_empty(&warehouse)) {

     computer[i] = dequeue(&warehouse);

     printf("컴퓨터[%d](을/를) 수리중입니다.   남은기간:[%d]일\n", computer[i].id, computer[i].service_time);

     if (computer[i].service_time > 0) {

      computer[i].service_time--;

      if (computer[i].service_time == 0) {

       computer[i].status = 1;

      }

     }

    }

   }

   else if (computer[i].status == 0) {

    printf("컴퓨터[%d](을/를) 수리중입니다.   남은기간:[%d]일\n", computer[i].id, computer[i].service_time);

    if (computer[i].service_time > 0) {

     computer[i].service_time--;

     if (computer[i].service_time == 0) {

      computer[i].status = 1;

     }

    }

   }

  }

  printf("\n");

  printf("------------------------------------------------\n");

  printf("     ※ 공지사항 ※\n");

  for (int i = 0; i

   if (finished_computer[i].status == 1) {

    printf("컴퓨터[%d]의 수리가 끝났습니다. 가져가주세요\n", finished_computer[i].id);

    init_cpt(finished_computer[i]);

    pay_total += rand() + 5;

    total_computers++;

   }

  }

  if (check_new == 1) {

   printf("\n컴퓨터[%d]의 수리요청 접수!.", Num_computer - 1);

   check_new = 0;

  }

  printf("\n\n");

 }

 printf("%d일 동안 얻은 총 보수는 [%d]만원 입니다.\n", End_day, pay_total);

 printf("%d일 동안 수리한 컴퓨터 수는 총 [%d]대 입니다.\n\n", End_day, total_computers);


 return 0;

}


출력해보면

                    - 7일차 -


-------------------수리현황판-------------------


컴퓨터[4](을/를) 수리중입니다.   남은기간:[2]일

컴퓨터[3](을/를) 수리중입니다.   남은기간:[6]일

컴퓨터[5](을/를) 수리중입니다.   남은기간:[6]일


------------------------------------------------

     ※ 공지사항 ※

컴퓨터[0]의 수리가 끝났습니다. 가져가주세요

컴퓨터[1]의 수리가 끝났습니다. 가져가주세요

컴퓨터[2]의 수리가 끝났습니다. 가져가주세요



                    - 8일차 -


-------------------수리현황판-------------------


컴퓨터[4](을/를) 수리중입니다.   남은기간:[1]일

컴퓨터[3](을/를) 수리중입니다.   남은기간:[5]일

컴퓨터[5](을/를) 수리중입니다.   남은기간:[5]일


------------------------------------------------

     ※ 공지사항 ※

컴퓨터[0]의 수리가 끝났습니다. 가져가주세요

컴퓨터[1]의 수리가 끝났습니다. 가져가주세요

컴퓨터[2]의 수리가 끝났습니다. 가져가주세요



                    - 9일차 -


-------------------수리현황판-------------------


컴퓨터[6](을/를) 수리중입니다.   남은기간:[2]일

컴퓨터[3](을/를) 수리중입니다.   남은기간:[4]일

컴퓨터[5](을/를) 수리중입니다.   남은기간:[4]일


------------------------------------------------

     ※ 공지사항 ※

컴퓨터[4]의 수리가 끝났습니다. 가져가주세요

컴퓨터[1]의 수리가 끝났습니다. 가져가주세요

컴퓨터[2]의 수리가 끝났습니다. 가져가주세요


컴퓨터[8]의 수리요청 접수!.


대충 이런식으로 나오는데


나는 한번 공지사항에 수리가 끝났다고 나온거는 다시 안나오게끔 하고싶음..

(만약 8일차에 컴퓨터[1],[2] 수리가 끝났다고 나왔으면 9일차에는 안나오게끔)


이 부분 오늘 10시간 동안 붙잡았는데 해결을 못함... 자기혐오생긴다..


혹시 알려주는 사람 한테는 선물 주겠슴