피자 메뉴를 입력받고, 여러 주문을 입력받아 주문 내역과 가동률을 구하는 프로그램
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 |
'Programing > Java' 카테고리의 다른 글
Java :: 적은 비용의 계단 구하기 (0) | 2018.09.27 |
---|---|
Java :: 근접한 정수 구하기(시그마, 팩토리얼, 제곱) (0) | 2018.09.17 |
Java :: 음료 주문 처리 프로그램 (0) | 2018.09.12 |
Java :: 학생 점수로 우수학생 판별 프로그램 (0) | 2018.09.10 |
Java :: 가위바위보프로그램 (1) | 2018.03.26 |