본문 바로가기

프로그래밍 언어/Java

[Java] 피자 가게 프로그램


피자 가게의 주문과 요리 시간을 계산하는 프로그램



<조건>


각 피자별로 오븐 존재


<입력>


피자 번호  |  피자 이름  |  요리 시간 (0 입력 시 종료)

0

주문 번호  |  주문 시간  |  주문 피자 번호 (0 입력 시 종료)

0


<출력>


=== 메뉴판 ===

주문 메뉴 (요리시간)


주문 리스트  |  주문시간  |  요리시작  |  서빙시간

=== 오븐 요리 현황 ===

피자 이름 (요리시간)

[주문번호] 주문시간  |  요리 시작시간 ~ 서빙시간  |  (대기시간)

완료 개수  (평균 대기 시간)  [가동률]




<코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import java.util.Scanner;
import java.util.ArrayList;
 
public class PizzaDemo {
    static ArrayList<Oven> ovenArr = new ArrayList<Oven>();
    ArrayList<Order> orderArr = new ArrayList<Order>();
    static double allTime = 1.0;
    
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        PizzaDemo demo = new PizzaDemo();
        demo.doitMenu(scan);
        demo.doitOrder(scan);
        demo.doitCompute();
        demo.print();
    }
    void doitMenu(Scanner scan) {
        Oven oven;
        int num = 0;
        while (true) {
            if ((num = scan.nextInt()) == 0) { break; }
            oven = new Oven(num);
            oven.input(scan);
            ovenArr.add(oven);
        }
    }
    void doitOrder(Scanner scan) {
        int num = 0;
        Order order;
        while (true) {
            if ((num = scan.nextInt()) == 0) { break; }
            order = new Order(num);
            order.input(scan);
            orderArr.add(order);
            ovenArr.get(order.cookingNum - 1).orderAdd(order);
            ovenArr.get(order.cookingNum - 1).waitingTime();
        }
    }
    void doitCompute() {
        for (Oven i : ovenArr)
            i.orderCompute();
        for (Order i: orderArr) {
            if (allTime < i.endCooking) {
                allTime = i.endCooking;
            }
        }
    }
    void print() {
        printMenu();
        printOrderList();
        System.out.println("\n\n====== 오븐 요리 현황 =====");
        for (int i = 0; i < ovenArr.size(); i++
            ovenArr.get(i).print(allTime);
    }
    void printMenu() {
        System.out.println("====== 메뉴판 ======");
        for (int i = 0; i < ovenArr.size(); i++
            System.out.printf("%-10s(요리시간 %d분)\n", ovenArr.get(i).menuName, ovenArr.get(i).cookingTime);
    }
    void printOrderList() {
        Order order;
        System.out.printf("\n%10s%10s%8s%5s\n""주문리스트""주문""요리시작""서빙");
        for (int i = 0; i < orderArr.size(); i++) {
            order = orderArr.get(i);
            System.out.printf("[%2d] %-10s%2d분 - %2d분 - %2d분\n", order.orderNum, order.menuName, 
                                order.orderTime, order.startCooking, order.endCooking);
        }
    }
}
 
class Oven {
    ArrayList<Order> orderArr = new ArrayList<Order>();
    int cookingNum = 0;
    String menuName = null;
    int cookingTime = 0;
    int waitingTime = 0;
    
    Oven(int num) {
        cookingNum = num;
    }
    void input(Scanner scan) {
        menuName = scan.next();
        cookingTime = scan.nextInt();
    }
    void orderAdd(Order order) {
        orderArr.add(order);
        order.menuName = this.menuName;
    }
    void waitingTime() {
        waitingTime += cookingTime;
    }
    void orderCompute() {
        if (orderArr.size() < 2) { return; }
        int prevEndCooking = orderArr.get(orderArr.size() - 2).endCooking;
        int startCooking = orderArr.get(orderArr.size() - 1).startCooking;
        if (prevEndCooking <= startCooking) { return; }
        orderArr.get(orderArr.size() - 1).startCooking = prevEndCooking;
        orderArr.get(orderArr.size() - 1).endCooking = prevEndCooking + cookingTime;
        waitingTime += prevEndCooking - startCooking;
    }
    void print(double allTime) {
        System.out.printf("%-10s(요리시간 %d분)\n", menuName, cookingTime);
        for (int i = 0; i < orderArr.size(); i++) {
            orderArr.get(i).print(cookingTime);
        }
        System.out.printf("%d개 완료 (평균 %.1f분 대기) [가동률 %.1f%%]\n\n", orderArr.size(), (double)waitingTime/orderArr.size(), 
                                                                    cookingTime * orderArr.size() / allTime * 100);
    }
}
 
class Order {
    int orderNum = 0;
    int orderTime = 0;
    int cookingNum = 0;
    int startCooking = 0;
    int endCooking = 0;
    String menuName = null;
    
    Order(int num) {
        orderNum = num;
    }
    void input(Scanner scan) {
        startCooking = orderTime = scan.nextInt();
        cookingNum = scan.nextInt();
        endCooking = startCooking + PizzaDemo.ovenArr.get(cookingNum - 1).cookingTime;
    }
    void print(int cookingTime) {
        System.out.printf("[%2d]%-5d분 주문 %d ~ %d (%-2d분 대기)\n", orderNum, orderTime, startCooking, endCooking, 
                                                                (startCooking - orderTime) + cookingTime);
    }
}
cs




<실행 결과>