본문으로 바로가기

Java :: 피자 주문 프로그램

category Programing/Java 2018. 9. 27. 20:22

피자 메뉴를 입력받고, 여러 주문을 입력받아 주문 내역과 가동률을 구하는 프로그램



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
import java.util.Scanner;
import java.util.ArrayList;
 
/**
 * 
 * 객체 지향에 대해서 어느정도 이해했다고 생각했는데
 * 이번 문제 풀면서 또 많은것을 느낀것 같습니다.
 * 최대한 메소드 길이를 비슷하게 맞춰보려고 노력했으나 역시 쉽지가 않네요
 * 부족한 부분 최대한 피드백 많이 해주시면
 * 고쳐보겠습니다!!
 * 
 * @author LeeJaeSeung (g0pher)
 */
public class PizzaDemo {
    ArrayList<Pizza> pizza = new ArrayList<Pizza>();
    ArrayList<Order> order = new ArrayList<Order>();
    
    double lastServing = 1.0;
    
    public static void main(String [] args) {
        PizzaDemo start = new PizzaDemo();
        start.doit();
    }
    void doit() {
        Scanner sc = new Scanner(System.in);
        inputPizza(sc);
        inputOrder(sc);
        process();
        printInfo();
        printResult();
    }
    void inputPizza(Scanner sc) {
        while (true) {
            int number = sc.nextInt();
            if (number == 0) { break; }
            pizza.add(new Pizza(number, sc));
        }
    }
    void inputOrder(Scanner sc) {
        while (true) {
            int number = sc.nextInt();
            if (number == 0) { break; }
            order.add(new Order(number, sc));
        }
    }
    void process() {
        for (Order i: order) {
            pizza.get(i.pizzaNum - 1).order(i);
            if (lastServing < i.servingTime) {
                lastServing = i.servingTime;
            }
        }
    }
    void printInfo() {
        System.out.println("  ====== 메뉴판 ======");
        for (Pizza i: pizza) { i.print(); }
        System.out.printf("\n\n%15s %10s %10s %10s\n""주문리스트""주문""요리시작""서빙");
        for (Order i: order) {
            String pizzaName = pizza.get(i.pizzaNum - 1).name;
            i.print(pizzaName);
        }
    }
    void printResult() {
        System.out.println("\n  ====== 오븐 요리 현황 ======");
        for (Pizza i: pizza) {
            System.out.printf("%s (요리시간 %d분)\n", i.name, i.time);
            for (Order j: i.o) {
                System.out.printf("[%d] %d분주문 %d~%d (%d분대기)\n"
                        ,j.number, j.orderTime, j.startTime
                        , j.servingTime, j.servingTime - j.orderTime);
            }
            double operatingRate = (i.o.size() * i.time / lastServing) * 100;
            System.out.println(lastServing);
            System.out.printf("%d개 완료 (평균 %.1f분 대기) [가동율 %.1f%%]\n\n"
                    , i.o.size(), i.average(), operatingRate);
        }
    }
}
 
class Pizza {
    int number;
    String name;
    int time;
    ArrayList<Order> o = new ArrayList<Order>();
    
    Pizza(int number, Scanner sc) {
        this.number = number;
        name = sc.next();
        time = sc.nextInt();
    }
    void order(Order order) {
        o.add(order);
        if (o.size() > 1) {
            Order prev = o.get(o.size() - 2);
            if (prev.servingTime > order.orderTime) {
                order.startTime = prev.servingTime;
            }    
        }
        order.servingTime = order.startTime + time;
    }
    void print() {
        System.out.printf("%-10s (요리시간 %d분)\n", name, time);
    }
    double average() {
        int sum = 0;
        if (o.size() == 0) { return 0.0; }
        for (Order i: o) {
            sum += i.servingTime - i.orderTime;
        }
        return (double)sum / o.size();
    }
}
 
class Order {
    int number;
    int orderTime;
    int pizzaNum;
    int startTime;
    int servingTime;
    
    Order(int number, Scanner sc) {
        this.number = number;
        orderTime = startTime = sc.nextInt();
        pizzaNum = sc.nextInt();
    }
    void print(String pizzaName) {
        System.out.printf("[%d] %-10s %2d분 -- %2d분 -- %2d분\n"
                ,number, pizzaName, orderTime, startTime, servingTime);
    }
}
cs