From 78aee469c05c4657e6daaea834f486ebcde47c5c Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Fri, 9 Dec 2022 11:49:40 +0900 Subject: [PATCH 1/9] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 ++++++++++ src/main/java/vendingmachine/domain/Machine.java | 4 ++++ src/main/java/vendingmachine/domain/Product.java | 4 ++++ src/main/java/vendingmachine/view/InputView.java | 4 ++++ src/main/java/vendingmachine/view/OutputView.java | 4 ++++ 5 files changed, 26 insertions(+) create mode 100644 docs/README.md create mode 100644 src/main/java/vendingmachine/domain/Machine.java create mode 100644 src/main/java/vendingmachine/domain/Product.java create mode 100644 src/main/java/vendingmachine/view/InputView.java create mode 100644 src/main/java/vendingmachine/view/OutputView.java diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..b561fc821 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +## 기능 요구 사항 + +- [ ] 자판기의 보유 금액을 입력한다. `InputView` +- [ ] 자판기의 보유 금액을 기반으로 무작위로 동전의 갯수를 생성한다. `Machine` +- [ ] 생성한 자판기의 동전갯수를 출력한다. `OutputView` +- [ ] 상품명, 가격, 수량을 입력받는다. `InputView` +- [ ] 사용자에게 투입 금액을 입력받는다. `InputView` +- [ ] 구매할 상품 명을 입력받는다. `상품의 최소 금액 > 남은 금액일 때 까지 반복` - `InputView` +- [ ] 상품을 구매하고 남은 돈을 출력한다. `OutputView` +- [ ] 상품을 구매하고 나면 동전을 최소로 해서 거슬러 준다. `동전이 모자랄 땐 남은 금액은 반환하지 않음` `OutputView` \ No newline at end of file diff --git a/src/main/java/vendingmachine/domain/Machine.java b/src/main/java/vendingmachine/domain/Machine.java new file mode 100644 index 000000000..547b69ee2 --- /dev/null +++ b/src/main/java/vendingmachine/domain/Machine.java @@ -0,0 +1,4 @@ +package vendingmachine.domain; + +public class Machine { +} diff --git a/src/main/java/vendingmachine/domain/Product.java b/src/main/java/vendingmachine/domain/Product.java new file mode 100644 index 000000000..a2ea1f7c9 --- /dev/null +++ b/src/main/java/vendingmachine/domain/Product.java @@ -0,0 +1,4 @@ +package vendingmachine.domain; + +public class Product { +} diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java new file mode 100644 index 000000000..126e50dbd --- /dev/null +++ b/src/main/java/vendingmachine/view/InputView.java @@ -0,0 +1,4 @@ +package vendingmachine.view; + +public class InputView { +} diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java new file mode 100644 index 000000000..2a53e8a58 --- /dev/null +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -0,0 +1,4 @@ +package vendingmachine.view; + +public class OutputView { +} From d530275af2c022dc8c4aa82ed3f4f4bb0ef00b6d Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Fri, 9 Dec 2022 12:13:19 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20Product=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/domain/Product.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/vendingmachine/domain/Product.java b/src/main/java/vendingmachine/domain/Product.java index a2ea1f7c9..390d6fe4b 100644 --- a/src/main/java/vendingmachine/domain/Product.java +++ b/src/main/java/vendingmachine/domain/Product.java @@ -1,4 +1,13 @@ package vendingmachine.domain; public class Product { + private String name; + private int price; + private int quantity; + + public Product(String name, int price, int quantity) { + this.name = name; + this.price = price; + this.quantity = quantity; + } } From 9b4701dcf39155dbbf7fea7f3b7eddf6bf276671 Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Sat, 10 Dec 2022 16:22:01 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/Application.java | 15 +++++- .../java/vendingmachine/MessageConstant.java | 7 +++ .../controller/MachineController.java | 10 ++++ .../controller/MainController.java | 19 ++++++++ .../vendingmachine/{ => domain}/Coin.java | 9 +++- .../java/vendingmachine/domain/Machine.java | 46 +++++++++++++++++++ .../java/vendingmachine/view/InputView.java | 27 +++++++++++ .../java/vendingmachine/view/OutputView.java | 24 ++++++++++ 8 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 src/main/java/vendingmachine/MessageConstant.java create mode 100644 src/main/java/vendingmachine/controller/MachineController.java create mode 100644 src/main/java/vendingmachine/controller/MainController.java rename src/main/java/vendingmachine/{ => domain}/Coin.java (55%) diff --git a/src/main/java/vendingmachine/Application.java b/src/main/java/vendingmachine/Application.java index 9d3be447b..19797a0db 100644 --- a/src/main/java/vendingmachine/Application.java +++ b/src/main/java/vendingmachine/Application.java @@ -1,7 +1,20 @@ package vendingmachine; +import vendingmachine.controller.MachineController; +import vendingmachine.domain.Coin; +import vendingmachine.domain.Machine; +import vendingmachine.domain.Product; +import vendingmachine.view.OutputView; + +import java.util.*; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + Product product = new Product("콜라",2000,20); + Machine machine = new Machine(product); + LinkedHashMap coinMap = machine.getCoins(); + OutputView.printMachineInputMoneyMsg(); + OutputView.printMachineHasCoins(coinMap); + } } diff --git a/src/main/java/vendingmachine/MessageConstant.java b/src/main/java/vendingmachine/MessageConstant.java new file mode 100644 index 000000000..c9093e1f3 --- /dev/null +++ b/src/main/java/vendingmachine/MessageConstant.java @@ -0,0 +1,7 @@ +package vendingmachine; + +public class MessageConstant { + public static final String INPUT_VENDING_MACHINE_HAS_MONEY_MSG = "자판기가 보유하고 있는 금액을 입력해 주세요."; + public static final String MACHINE_HAS_COIN_MSG = "자판기가 보유한 동전"; + +} diff --git a/src/main/java/vendingmachine/controller/MachineController.java b/src/main/java/vendingmachine/controller/MachineController.java new file mode 100644 index 000000000..38dafe1de --- /dev/null +++ b/src/main/java/vendingmachine/controller/MachineController.java @@ -0,0 +1,10 @@ +package vendingmachine.controller; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class MachineController { + +} diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java new file mode 100644 index 000000000..bdfe56061 --- /dev/null +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -0,0 +1,19 @@ +package vendingmachine.controller; + +import vendingmachine.view.InputView; +import vendingmachine.view.OutputView; + +public class MainController { + + /** + * 1. 자판기가 보유한 금액을 입력받는다 + * 2. 자판기가 보유한 동전을 보여준다 + * 3. 상품명, 가격, 수량을 입력받는다 + * 4. 투입 금액을 입력받는다. + * 5, 구매할 상품을 입력받는다. (돈 모자랄때 까지) + * 6. 잔돈을 출력한다. + */ + public void run() { + InputView.inputMachineHoldMoney(); + } +} diff --git a/src/main/java/vendingmachine/Coin.java b/src/main/java/vendingmachine/domain/Coin.java similarity index 55% rename from src/main/java/vendingmachine/Coin.java rename to src/main/java/vendingmachine/domain/Coin.java index c76293fbc..7953908ca 100644 --- a/src/main/java/vendingmachine/Coin.java +++ b/src/main/java/vendingmachine/domain/Coin.java @@ -1,4 +1,6 @@ -package vendingmachine; +package vendingmachine.domain; + +import java.util.stream.Stream; public enum Coin { COIN_500(500), @@ -12,5 +14,8 @@ public enum Coin { this.amount = amount; } - // 추가 기능 구현 + @Override + public String toString() { + return this.amount + "원"; + } } diff --git a/src/main/java/vendingmachine/domain/Machine.java b/src/main/java/vendingmachine/domain/Machine.java index 547b69ee2..ca4ba1f2a 100644 --- a/src/main/java/vendingmachine/domain/Machine.java +++ b/src/main/java/vendingmachine/domain/Machine.java @@ -1,4 +1,50 @@ package vendingmachine.domain; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.*; + public class Machine { + /** + * 자판기 클래스에서는 필요한게 보유하고 있는 금액을 받는다. + * 받고 나서 랜덤으로 생성한 동전의 데이터만 갖고 있다. + * 그렇다면 코인은 List로 존재하여야 한다. + */ + private Product product; + private LinkedHashMap coins; + + public Machine(Product product) { + this.product = product; + this.coins = generateCoinMap(); + } + + public LinkedHashMap getCoins() { + return coins; + } + + private LinkedHashMap generateCoinMap() { + LinkedHashMap coinMap = new LinkedHashMap<>(); + coinMap.put(Coin.COIN_500, 0); + coinMap.put(Coin.COIN_100, 0); + coinMap.put(Coin.COIN_50, 0); + coinMap.put(Coin.COIN_10, 0); + return coinMap; + } + + private void generateCoin(int moneyInput) { + List coinUnit = new ArrayList<>(); + coinUnit.add(500); + coinUnit.add(100); + coinUnit.add(50); + coinUnit.add(10); + + while(moneyInput >= 0) { + int pickRandomNum = Randoms.pickNumberInList(coinUnit); + if (moneyInput - pickRandomNum >= 0) { + moneyInput -= pickRandomNum; + coins.put(moneyInput, coins.get(moneyInput) + 1); + } + } + } + } diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index 126e50dbd..e61e4c917 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -1,4 +1,31 @@ package vendingmachine.view; +import camp.nextstep.edu.missionutils.Console; public class InputView { + private InputView() {} + + /** + * 자판기가 초기에 갖고 있는 돈을 입력하는 함수 + * @return + */ + + public static int inputMachineHoldMoney() { + return Integer.parseInt(Console.readLine()); + } + + /** + * 상품명, 가격, 수량을 입력하는 함수 + * @return + */ + public static String inputProductDetail() { + return Console.readLine(); + } + + public static int inputMoney() { + return Integer.parseInt(Console.readLine()); + } + + public static String inputPurchaseProduct() { + return Console.readLine(); + } } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 2a53e8a58..7d8666413 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -1,4 +1,28 @@ package vendingmachine.view; +import vendingmachine.MessageConstant; +import vendingmachine.domain.Coin; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class OutputView { + + private OutputView() { + + } + public static void printMachineInputMoneyMsg() { + System.out.println(MessageConstant.INPUT_VENDING_MACHINE_HAS_MONEY_MSG); + } + public static void printMachineHasCoinMsg() { + System.out.println(MessageConstant.MACHINE_HAS_COIN_MSG); + } + + public static void printMachineHasCoins(HashMap coins) { + printMachineHasCoinMsg(); + for (Coin coin : coins.keySet()) { + System.out.println(coin.toString() + " - " ); + } + } } From 77f5cef02608e1e697246562512e1ec37402021e Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Sun, 11 Dec 2022 18:23:45 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20main=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EC=97=90=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 잔돈 출력하는 OutputView 구현 완료 - 각 상품의 가격에 따라 동전의 갯수 줄도록 구현해야함 --- src/main/java/vendingmachine/Application.java | 46 +++++++++++++++++-- src/main/java/vendingmachine/Constant.java | 5 ++ src/main/java/vendingmachine/domain/Coin.java | 15 ++++++ .../java/vendingmachine/domain/Machine.java | 35 +++++++++----- .../java/vendingmachine/domain/Product.java | 16 +++++++ .../java/vendingmachine/view/InputView.java | 1 + .../java/vendingmachine/view/OutputView.java | 18 +++++++- 7 files changed, 118 insertions(+), 18 deletions(-) create mode 100644 src/main/java/vendingmachine/Constant.java diff --git a/src/main/java/vendingmachine/Application.java b/src/main/java/vendingmachine/Application.java index 19797a0db..204860efe 100644 --- a/src/main/java/vendingmachine/Application.java +++ b/src/main/java/vendingmachine/Application.java @@ -4,17 +4,55 @@ import vendingmachine.domain.Coin; import vendingmachine.domain.Machine; import vendingmachine.domain.Product; +import vendingmachine.view.InputView; import vendingmachine.view.OutputView; import java.util.*; +import java.util.stream.Stream; + +import static vendingmachine.Constant.*; public class Application { - public static void main(String[] args) { - Product product = new Product("콜라",2000,20); - Machine machine = new Machine(product); + public static void main(String[] args) throws Throwable { + Machine machine = new Machine(); LinkedHashMap coinMap = machine.getCoins(); - OutputView.printMachineInputMoneyMsg(); + int machineInputMoney = InputView.inputMachineHoldMoney(); + machine.generateCoin(machineInputMoney); OutputView.printMachineHasCoins(coinMap); +// + + List products = new ArrayList<>(); + String[] productsInput = InputView.inputProductDetail().split(";"); // 입력받아서 ;로 분리함 + for (int i = 0; i < productsInput.length; i++) { + String productDetail = productsInput[i].replaceAll(Constant.REX, ""); + String[] productInfo = productDetail.split(","); + Product freshProduct = new Product(productInfo[0],Integer.parseInt(productInfo[1]),Integer.parseInt(productInfo[2])); + products.add(freshProduct); + } + int minProductPrice = products.get(0).getPrice(); + for (int i = 1; i < products.size(); i++) { + if (minProductPrice > products.get(i).getPrice()) { + minProductPrice = products.get(i).getPrice(); + } + } + int userMoneyInput = InputView.inputMoney(); + while (userMoneyInput > minProductPrice) { + OutputView.printCurrentInputMoney(userMoneyInput); + String purchasingProduct = InputView.inputPurchaseProduct(); + Product inputProduct = products.stream() + .filter(x -> x.getName().equals(purchasingProduct)) + .findFirst().orElse(null); + if(inputProduct == null) { + throw new IllegalArgumentException("[ERROR]"); + } + userMoneyInput -= inputProduct.getPrice(); + } + + OutputView.printCurrentInputMoney(userMoneyInput); + OutputView.printChange(coinMap); + + + // [콜라,1200,20];[사이다,2000,20] } } diff --git a/src/main/java/vendingmachine/Constant.java b/src/main/java/vendingmachine/Constant.java new file mode 100644 index 000000000..9d4a50be1 --- /dev/null +++ b/src/main/java/vendingmachine/Constant.java @@ -0,0 +1,5 @@ +package vendingmachine; + +public class Constant { + public static final String REX= "[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9,]"; +} diff --git a/src/main/java/vendingmachine/domain/Coin.java b/src/main/java/vendingmachine/domain/Coin.java index 7953908ca..44bf88907 100644 --- a/src/main/java/vendingmachine/domain/Coin.java +++ b/src/main/java/vendingmachine/domain/Coin.java @@ -1,5 +1,7 @@ package vendingmachine.domain; +import java.util.Arrays; +import java.util.function.Supplier; import java.util.stream.Stream; public enum Coin { @@ -14,6 +16,19 @@ public enum Coin { this.amount = amount; } + /** + * 이 함수가 요구하는 것은 coin이라는 숫자를 받았을때 Coin Enum을 가져오는 것 + * @param coin + * @return + */ + public static Coin valueOf(int coin) throws Throwable { + Supplier IllegalArgumentException = null; + return Arrays.stream(Coin.values()) + .filter(Coin -> Coin.amount == coin) + .findFirst() + .orElseThrow(null); + } + @Override public String toString() { return this.amount + "원"; diff --git a/src/main/java/vendingmachine/domain/Machine.java b/src/main/java/vendingmachine/domain/Machine.java index ca4ba1f2a..2df4d7ebb 100644 --- a/src/main/java/vendingmachine/domain/Machine.java +++ b/src/main/java/vendingmachine/domain/Machine.java @@ -10,11 +10,9 @@ public class Machine { * 받고 나서 랜덤으로 생성한 동전의 데이터만 갖고 있다. * 그렇다면 코인은 List로 존재하여야 한다. */ - private Product product; private LinkedHashMap coins; - public Machine(Product product) { - this.product = product; + public Machine() { this.coins = generateCoinMap(); } @@ -31,20 +29,33 @@ private LinkedHashMap generateCoinMap() { return coinMap; } - private void generateCoin(int moneyInput) { + /** + * 자판기가 갖고 있는 돈을 인자로 받아서 + * 코인을 하나씩 랜덤으로 생성한다. + * 랜덤으로 생성한 돈이 현재 보유한 돈 보다 크면 다시 시도한다. + * 보유한 돈이 0이되면 그만한다. + * @param moneyInput + */ + public void generateCoin(int moneyInput) throws Throwable { + List coinUnit = getCoinUnit(); + while(moneyInput > 0) { + int pickRandomNum = Randoms.pickNumberInList(coinUnit); + Coin randomCoin = Coin.valueOf(pickRandomNum); + if (moneyInput - pickRandomNum < 0) { + continue; + } + moneyInput -= pickRandomNum; + coins.put(randomCoin, coins.get(randomCoin) + 1); + } + } + + private static List getCoinUnit() { List coinUnit = new ArrayList<>(); coinUnit.add(500); coinUnit.add(100); coinUnit.add(50); coinUnit.add(10); - - while(moneyInput >= 0) { - int pickRandomNum = Randoms.pickNumberInList(coinUnit); - if (moneyInput - pickRandomNum >= 0) { - moneyInput -= pickRandomNum; - coins.put(moneyInput, coins.get(moneyInput) + 1); - } - } + return coinUnit; } } diff --git a/src/main/java/vendingmachine/domain/Product.java b/src/main/java/vendingmachine/domain/Product.java index 390d6fe4b..984f50eac 100644 --- a/src/main/java/vendingmachine/domain/Product.java +++ b/src/main/java/vendingmachine/domain/Product.java @@ -1,6 +1,10 @@ package vendingmachine.domain; +import java.util.Arrays; +import java.util.stream.Stream; + public class Product { + private String name; private int price; private int quantity; @@ -10,4 +14,16 @@ public Product(String name, int price, int quantity) { this.price = price; this.quantity = quantity; } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } + + public int getQuantity() { + return quantity; + } } diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index e61e4c917..614cbb142 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -10,6 +10,7 @@ private InputView() {} */ public static int inputMachineHoldMoney() { + OutputView.printMachineInputMoneyMsg(); return Integer.parseInt(Console.readLine()); } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 7d8666413..00b5bbf9d 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -4,6 +4,7 @@ import vendingmachine.domain.Coin; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -21,8 +22,21 @@ public static void printMachineHasCoinMsg() { public static void printMachineHasCoins(HashMap coins) { printMachineHasCoinMsg(); - for (Coin coin : coins.keySet()) { - System.out.println(coin.toString() + " - " ); + for (Map.Entry entry : coins.entrySet()) { + System.out.println(entry.getKey() + " - " + entry.getValue() + "개"); + } + } + + public static void printCurrentInputMoney(int money) { + System.out.println("투입 금액 : " + money + "원"); + } + + public static void printChange(LinkedHashMap coins) { + System.out.println("잔돈"); + for (Map.Entry entry : coins.entrySet()) { + if (entry.getValue() > 0) { + System.out.println(entry.toString() +"-" + entry.getValue() + "개"); + } } } } From 540121746195bed2a348415e7de36e34b2ea9fb9 Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Sun, 11 Dec 2022 23:48:03 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20=EB=AF=B8=EC=85=98=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/Application.java | 55 +------- src/main/java/vendingmachine/Validator.java | 17 +++ .../controller/MainController.java | 131 ++++++++++++++++-- src/main/java/vendingmachine/domain/Coin.java | 3 +- .../java/vendingmachine/domain/Machine.java | 2 +- .../java/vendingmachine/view/InputView.java | 14 +- .../java/vendingmachine/view/OutputView.java | 19 ++- 7 files changed, 170 insertions(+), 71 deletions(-) create mode 100644 src/main/java/vendingmachine/Validator.java diff --git a/src/main/java/vendingmachine/Application.java b/src/main/java/vendingmachine/Application.java index 204860efe..2b5933769 100644 --- a/src/main/java/vendingmachine/Application.java +++ b/src/main/java/vendingmachine/Application.java @@ -1,58 +1,11 @@ package vendingmachine; -import vendingmachine.controller.MachineController; -import vendingmachine.domain.Coin; -import vendingmachine.domain.Machine; -import vendingmachine.domain.Product; -import vendingmachine.view.InputView; -import vendingmachine.view.OutputView; +import vendingmachine.controller.MainController; -import java.util.*; -import java.util.stream.Stream; - -import static vendingmachine.Constant.*; public class Application { - public static void main(String[] args) throws Throwable { - Machine machine = new Machine(); - LinkedHashMap coinMap = machine.getCoins(); - int machineInputMoney = InputView.inputMachineHoldMoney(); - machine.generateCoin(machineInputMoney); - OutputView.printMachineHasCoins(coinMap); -// - - List products = new ArrayList<>(); - String[] productsInput = InputView.inputProductDetail().split(";"); // 입력받아서 ;로 분리함 - for (int i = 0; i < productsInput.length; i++) { - String productDetail = productsInput[i].replaceAll(Constant.REX, ""); - String[] productInfo = productDetail.split(","); - Product freshProduct = new Product(productInfo[0],Integer.parseInt(productInfo[1]),Integer.parseInt(productInfo[2])); - products.add(freshProduct); - } - int minProductPrice = products.get(0).getPrice(); - for (int i = 1; i < products.size(); i++) { - if (minProductPrice > products.get(i).getPrice()) { - minProductPrice = products.get(i).getPrice(); - } - } - int userMoneyInput = InputView.inputMoney(); - while (userMoneyInput > minProductPrice) { - OutputView.printCurrentInputMoney(userMoneyInput); - String purchasingProduct = InputView.inputPurchaseProduct(); - Product inputProduct = products.stream() - .filter(x -> x.getName().equals(purchasingProduct)) - .findFirst().orElse(null); - if(inputProduct == null) { - throw new IllegalArgumentException("[ERROR]"); - } - userMoneyInput -= inputProduct.getPrice(); - } - - OutputView.printCurrentInputMoney(userMoneyInput); - OutputView.printChange(coinMap); - - - // [콜라,1200,20];[사이다,2000,20] - + public static void main(String[] args) { + MainController mainController = new MainController(); + mainController.run(); } } diff --git a/src/main/java/vendingmachine/Validator.java b/src/main/java/vendingmachine/Validator.java new file mode 100644 index 000000000..d02c76e62 --- /dev/null +++ b/src/main/java/vendingmachine/Validator.java @@ -0,0 +1,17 @@ +package vendingmachine; + +public class Validator { + + public static void validateMachineHasMoneyInput(String money) { + if (Integer.parseInt(money) <= 0) { + throw new IllegalArgumentException("[ERROR] 입력한 금액이 올바르지 않습니다."); + } + } + + public static void validateMachineHasMoneyInputType(String money) { + String regExp = "^[0-9]+$"; + if (!money.matches(regExp)) { + throw new IllegalArgumentException("[ERROR] 숫자가 아닌 값이 포함되어 있습니다."); + } + } +} diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index bdfe56061..052e6d863 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -1,19 +1,130 @@ package vendingmachine.controller; +import vendingmachine.Constant; +import vendingmachine.domain.Coin; +import vendingmachine.domain.Machine; +import vendingmachine.domain.Product; import vendingmachine.view.InputView; import vendingmachine.view.OutputView; -public class MainController { +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; - /** - * 1. 자판기가 보유한 금액을 입력받는다 - * 2. 자판기가 보유한 동전을 보여준다 - * 3. 상품명, 가격, 수량을 입력받는다 - * 4. 투입 금액을 입력받는다. - * 5, 구매할 상품을 입력받는다. (돈 모자랄때 까지) - * 6. 잔돈을 출력한다. - */ +public class MainController { public void run() { - InputView.inputMachineHoldMoney(); + Machine machine = new Machine(); + LinkedHashMap coinMap = machine.getCoins(); + int machineInputMoney = InputView.inputMachineHoldMoney(); // 1. 자판기 돈 입력 + machine.generateCoin(machineInputMoney); + OutputView.printMachineHasCoins(coinMap); + + List products = new ArrayList<>(); + OutputView.printProductDetailInputMsg(); + String[] productsInput = InputView.inputProductDetail().split(";"); // 2. 상품입력 + for (String product : productsInput) { + String productDetail = product.replaceAll(Constant.REX, ""); + String[] productInfo = productDetail.split(","); + Product freshProduct = new Product(productInfo[0], Integer.parseInt(productInfo[1]), Integer.parseInt(productInfo[2])); + products.add(freshProduct); + } + int minProductPrice = products.get(0).getPrice(); + for (int i = 1; i < products.size(); i++) { + if (minProductPrice > products.get(i).getPrice()) { + minProductPrice = products.get(i).getPrice(); + } + } + OutputView.printInputMoneyMsg(); + int userMoneyInput = InputView.inputMoney(); + LinkedHashMap changeCoins = new LinkedHashMap<>(); + setChangeMap(changeCoins); + while (userMoneyInput > minProductPrice) { + OutputView.printCurrentInputMoney(userMoneyInput); // 현재 잔액을 출력함 + OutputView.printPurchaseProductInputMsg(); + String purchasingProduct = InputView.inputPurchaseProduct(); // 어떤 상품을 구매할껀지 입력 + Product inputProduct = products.stream() // + .filter(x -> x.getName().equals(purchasingProduct)) + .findFirst() + .orElse(null); + if(inputProduct == null) { + throw new IllegalArgumentException("[ERROR]"); + } + int productPrice = inputProduct.getPrice(); + userMoneyInput -= productPrice; + +// while (true) { +// if (productPrice >= 500 && coinMap.get(Coin.COIN_500) > 0) { +// coinMap.put(Coin.COIN_500, coinMap.get(Coin.COIN_500) - 1); +// productPrice -= 500; +// if (productPrice == 0) break; +// continue; +// } +// if (productPrice >= 100 && coinMap.get(Coin.COIN_100) > 0) { +// coinMap.put(Coin.COIN_100, coinMap.get(Coin.COIN_100) - 1); +// productPrice -= 100; +// if (productPrice == 0) break; +// continue; +// } +// if (productPrice >= 50 && coinMap.get(Coin.COIN_50) > 0) { +// coinMap.put(Coin.COIN_50, coinMap.get(Coin.COIN_50) - 1); +// productPrice -= 50; +// if (productPrice == 0) break; +// continue; +// } +// if (productPrice >= 10 && coinMap.get(Coin.COIN_10) > 0) { +// coinMap.put(Coin.COIN_10, coinMap.get(Coin.COIN_10) - 1); +// productPrice -= 10; +// if (productPrice == 0) break; +// } +// if(coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0) { +// break; +// } +// } + } + OutputView.printCurrentInputMoney(userMoneyInput); + while (true) { + if (userMoneyInput >= 500 && coinMap.get(Coin.COIN_500) > 0) { + coinMap.put(Coin.COIN_500, coinMap.get(Coin.COIN_500) - 1); + changeCoins.put(Coin.COIN_500, changeCoins.get(Coin.COIN_500) + 1); + userMoneyInput -= 500; + if (userMoneyInput == 0) break; + continue; + } + if (userMoneyInput >= 100 && coinMap.get(Coin.COIN_100) > 0) { + coinMap.put(Coin.COIN_100, coinMap.get(Coin.COIN_100) - 1); + changeCoins.put(Coin.COIN_100, changeCoins.get(Coin.COIN_100) + 1); + userMoneyInput -= 100; + if (userMoneyInput == 0) break; + continue; + } + if (userMoneyInput >= 50 && coinMap.get(Coin.COIN_50) > 0) { + coinMap.put(Coin.COIN_50, coinMap.get(Coin.COIN_50) - 1); + changeCoins.put(Coin.COIN_50, changeCoins.get(Coin.COIN_50) + 1); + userMoneyInput -= 50; + if (userMoneyInput == 0) break; + continue; + } + if (userMoneyInput >= 10 && coinMap.get(Coin.COIN_10) > 0) { + coinMap.put(Coin.COIN_10, coinMap.get(Coin.COIN_10) - 1); + changeCoins.put(Coin.COIN_10, changeCoins.get(Coin.COIN_10) + 1); + userMoneyInput -= 10; + if (userMoneyInput == 0) break; + } + if(coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0) { + break; + } + } +// for (Map.Entry entry : changeCoins.entrySet()) { +// System.out.println(entry.getKey() + " : " + entry.getValue()); +// } + OutputView.printChange(changeCoins); + } + + private static void setChangeMap(Map coinsMap) { + coinsMap.put(Coin.COIN_500, 0); + coinsMap.put(Coin.COIN_100, 0); + coinsMap.put(Coin.COIN_50, 0); + coinsMap.put(Coin.COIN_10, 0); } } diff --git a/src/main/java/vendingmachine/domain/Coin.java b/src/main/java/vendingmachine/domain/Coin.java index 44bf88907..f18bfad6f 100644 --- a/src/main/java/vendingmachine/domain/Coin.java +++ b/src/main/java/vendingmachine/domain/Coin.java @@ -21,8 +21,7 @@ public enum Coin { * @param coin * @return */ - public static Coin valueOf(int coin) throws Throwable { - Supplier IllegalArgumentException = null; + public static Coin valueOf(int coin) { return Arrays.stream(Coin.values()) .filter(Coin -> Coin.amount == coin) .findFirst() diff --git a/src/main/java/vendingmachine/domain/Machine.java b/src/main/java/vendingmachine/domain/Machine.java index 2df4d7ebb..cbbd3dfdb 100644 --- a/src/main/java/vendingmachine/domain/Machine.java +++ b/src/main/java/vendingmachine/domain/Machine.java @@ -36,7 +36,7 @@ private LinkedHashMap generateCoinMap() { * 보유한 돈이 0이되면 그만한다. * @param moneyInput */ - public void generateCoin(int moneyInput) throws Throwable { + public void generateCoin(int moneyInput) { List coinUnit = getCoinUnit(); while(moneyInput > 0) { int pickRandomNum = Randoms.pickNumberInList(coinUnit); diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index 614cbb142..f0a4f370f 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -1,6 +1,8 @@ package vendingmachine.view; import camp.nextstep.edu.missionutils.Console; +import vendingmachine.Validator; + public class InputView { private InputView() {} @@ -10,8 +12,16 @@ private InputView() {} */ public static int inputMachineHoldMoney() { - OutputView.printMachineInputMoneyMsg(); - return Integer.parseInt(Console.readLine()); + try { + OutputView.printMachineInputMoneyMsg(); + String inputMoney = Console.readLine(); + Validator.validateMachineHasMoneyInput(inputMoney); + Validator.validateMachineHasMoneyInputType(inputMoney); + return Integer.parseInt(inputMoney); + } catch (IllegalArgumentException error) { + System.out.println(error.getMessage()); + } + return -1; } /** diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 00b5bbf9d..e15d98d6a 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -5,13 +5,10 @@ import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; public class OutputView { - private OutputView() { - } public static void printMachineInputMoneyMsg() { System.out.println(MessageConstant.INPUT_VENDING_MACHINE_HAS_MONEY_MSG); @@ -27,15 +24,27 @@ public static void printMachineHasCoins(HashMap coins) { } } + public static void printProductDetailInputMsg() { + System.out.println("상품명과 가격, 수량을 입력해 주세요."); + } + + public static void printInputMoneyMsg() { + System.out.println("투입 금액을 입력해 주세요."); + } + public static void printCurrentInputMoney(int money) { - System.out.println("투입 금액 : " + money + "원"); + System.out.println("투입 금액: " + money + "원"); + } + + public static void printPurchaseProductInputMsg() { + System.out.println("구매할 상품명을 입력해 주세요."); } public static void printChange(LinkedHashMap coins) { System.out.println("잔돈"); for (Map.Entry entry : coins.entrySet()) { if (entry.getValue() > 0) { - System.out.println(entry.toString() +"-" + entry.getValue() + "개"); + System.out.println(entry.getKey() + " - " + entry.getValue() + "개"); } } } From adbf142b5d240044742d85c2a985c52a9428b000 Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Mon, 12 Dec 2022 17:42:26 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20controller=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/Validator.java | 8 ++ .../controller/MainController.java | 136 ++++++++---------- .../vendingmachine/{ => util}/Constant.java | 2 +- .../{ => util}/MessageConstant.java | 2 +- .../java/vendingmachine/view/InputView.java | 2 + .../java/vendingmachine/view/OutputView.java | 2 +- 6 files changed, 76 insertions(+), 76 deletions(-) rename src/main/java/vendingmachine/{ => util}/Constant.java (77%) rename src/main/java/vendingmachine/{ => util}/MessageConstant.java (89%) diff --git a/src/main/java/vendingmachine/Validator.java b/src/main/java/vendingmachine/Validator.java index d02c76e62..84934d8b7 100644 --- a/src/main/java/vendingmachine/Validator.java +++ b/src/main/java/vendingmachine/Validator.java @@ -1,5 +1,7 @@ package vendingmachine; +import vendingmachine.domain.Product; + public class Validator { public static void validateMachineHasMoneyInput(String money) { @@ -14,4 +16,10 @@ public static void validateMachineHasMoneyInputType(String money) { throw new IllegalArgumentException("[ERROR] 숫자가 아닌 값이 포함되어 있습니다."); } } + + public static void validateProduct(Product product) { + if (product == null) { + throw new IllegalArgumentException("[ERROR]"); + } + } } diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index 052e6d863..6f607274e 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -1,6 +1,7 @@ package vendingmachine.controller; -import vendingmachine.Constant; +import vendingmachine.Validator; +import vendingmachine.util.Constant; import vendingmachine.domain.Coin; import vendingmachine.domain.Machine; import vendingmachine.domain.Product; @@ -23,104 +24,93 @@ public void run() { List products = new ArrayList<>(); OutputView.printProductDetailInputMsg(); String[] productsInput = InputView.inputProductDetail().split(";"); // 2. 상품입력 - for (String product : productsInput) { - String productDetail = product.replaceAll(Constant.REX, ""); - String[] productInfo = productDetail.split(","); - Product freshProduct = new Product(productInfo[0], Integer.parseInt(productInfo[1]), Integer.parseInt(productInfo[2])); - products.add(freshProduct); - } - int minProductPrice = products.get(0).getPrice(); - for (int i = 1; i < products.size(); i++) { - if (minProductPrice > products.get(i).getPrice()) { - minProductPrice = products.get(i).getPrice(); - } - } - OutputView.printInputMoneyMsg(); + insertProduct(products, productsInput); + int minProductPrice = getMinProductPrice(products); int userMoneyInput = InputView.inputMoney(); - LinkedHashMap changeCoins = new LinkedHashMap<>(); - setChangeMap(changeCoins); + LinkedHashMap changeCoins = setChangeMap(); while (userMoneyInput > minProductPrice) { OutputView.printCurrentInputMoney(userMoneyInput); // 현재 잔액을 출력함 - OutputView.printPurchaseProductInputMsg(); String purchasingProduct = InputView.inputPurchaseProduct(); // 어떤 상품을 구매할껀지 입력 - Product inputProduct = products.stream() // - .filter(x -> x.getName().equals(purchasingProduct)) - .findFirst() - .orElse(null); - if(inputProduct == null) { - throw new IllegalArgumentException("[ERROR]"); - } + Product inputProduct = getProduct(products, purchasingProduct); int productPrice = inputProduct.getPrice(); userMoneyInput -= productPrice; - -// while (true) { -// if (productPrice >= 500 && coinMap.get(Coin.COIN_500) > 0) { -// coinMap.put(Coin.COIN_500, coinMap.get(Coin.COIN_500) - 1); -// productPrice -= 500; -// if (productPrice == 0) break; -// continue; -// } -// if (productPrice >= 100 && coinMap.get(Coin.COIN_100) > 0) { -// coinMap.put(Coin.COIN_100, coinMap.get(Coin.COIN_100) - 1); -// productPrice -= 100; -// if (productPrice == 0) break; -// continue; -// } -// if (productPrice >= 50 && coinMap.get(Coin.COIN_50) > 0) { -// coinMap.put(Coin.COIN_50, coinMap.get(Coin.COIN_50) - 1); -// productPrice -= 50; -// if (productPrice == 0) break; -// continue; -// } -// if (productPrice >= 10 && coinMap.get(Coin.COIN_10) > 0) { -// coinMap.put(Coin.COIN_10, coinMap.get(Coin.COIN_10) - 1); -// productPrice -= 10; -// if (productPrice == 0) break; -// } -// if(coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0) { -// break; -// } -// } } OutputView.printCurrentInputMoney(userMoneyInput); - while (true) { + + while (userMoneyInput != 0) { if (userMoneyInput >= 500 && coinMap.get(Coin.COIN_500) > 0) { - coinMap.put(Coin.COIN_500, coinMap.get(Coin.COIN_500) - 1); - changeCoins.put(Coin.COIN_500, changeCoins.get(Coin.COIN_500) + 1); + calculateChange(coinMap, Coin.COIN_500, changeCoins); userMoneyInput -= 500; - if (userMoneyInput == 0) break; continue; } if (userMoneyInput >= 100 && coinMap.get(Coin.COIN_100) > 0) { - coinMap.put(Coin.COIN_100, coinMap.get(Coin.COIN_100) - 1); - changeCoins.put(Coin.COIN_100, changeCoins.get(Coin.COIN_100) + 1); + calculateChange(coinMap, Coin.COIN_100, changeCoins); userMoneyInput -= 100; - if (userMoneyInput == 0) break; continue; } if (userMoneyInput >= 50 && coinMap.get(Coin.COIN_50) > 0) { - coinMap.put(Coin.COIN_50, coinMap.get(Coin.COIN_50) - 1); - changeCoins.put(Coin.COIN_50, changeCoins.get(Coin.COIN_50) + 1); + calculateChange(coinMap, Coin.COIN_50, changeCoins); userMoneyInput -= 50; - if (userMoneyInput == 0) break; continue; } if (userMoneyInput >= 10 && coinMap.get(Coin.COIN_10) > 0) { - coinMap.put(Coin.COIN_10, coinMap.get(Coin.COIN_10) - 1); - changeCoins.put(Coin.COIN_10, changeCoins.get(Coin.COIN_10) + 1); - userMoneyInput -= 10; - if (userMoneyInput == 0) break; - } - if(coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0) { - break; + userMoneyInput = generateChange(coinMap, userMoneyInput, changeCoins); + continue; } + if (checkRemainingCoins(coinMap)) break; } -// for (Map.Entry entry : changeCoins.entrySet()) { -// System.out.println(entry.getKey() + " : " + entry.getValue()); -// } OutputView.printChange(changeCoins); } + private static int generateChange(Map coinMap, int userMoneyInput ,Map changeCoins) { + calculateChange(coinMap, Coin.COIN_10, changeCoins); + userMoneyInput -= 10; + return userMoneyInput; + } + + private static boolean checkRemainingCoins(LinkedHashMap coinMap) { + return coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0; + } + + private static int getMinProductPrice(List products) { + int minProductPrice = products.get(0).getPrice(); + for (int i = 1; i < products.size(); i++) { + if (minProductPrice > products.get(i).getPrice()) { + minProductPrice = products.get(i).getPrice(); + } + } + return minProductPrice; + } + + private static void insertProduct(List products, String[] productsInput) { + for (String product : productsInput) { + String productDetail = product.replaceAll(Constant.REX, ""); + String[] productInfo = productDetail.split(","); + Product freshProduct = new Product(productInfo[0], Integer.parseInt(productInfo[1]), Integer.parseInt(productInfo[2])); + products.add(freshProduct); + } + } + + private static LinkedHashMap setChangeMap() { + LinkedHashMap changeCoins = new LinkedHashMap<>(); + setChangeMap(changeCoins); + return changeCoins; + } + + private static Product getProduct(List products, String purchasingProduct) { + Product inputProduct = products.stream() // + .filter(x -> x.getName().equals(purchasingProduct)) + .findFirst() + .orElse(null); + Validator.validateProduct(inputProduct); + return inputProduct; + } + + private static void calculateChange(Map coinMap, Coin coin, Map changeCoins) { + coinMap.put(coin, coinMap.get(coin) - 1); + changeCoins.put(coin, changeCoins.get(coin) + 1); + } + private static void setChangeMap(Map coinsMap) { coinsMap.put(Coin.COIN_500, 0); coinsMap.put(Coin.COIN_100, 0); diff --git a/src/main/java/vendingmachine/Constant.java b/src/main/java/vendingmachine/util/Constant.java similarity index 77% rename from src/main/java/vendingmachine/Constant.java rename to src/main/java/vendingmachine/util/Constant.java index 9d4a50be1..4b2a97626 100644 --- a/src/main/java/vendingmachine/Constant.java +++ b/src/main/java/vendingmachine/util/Constant.java @@ -1,4 +1,4 @@ -package vendingmachine; +package vendingmachine.util; public class Constant { public static final String REX= "[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9,]"; diff --git a/src/main/java/vendingmachine/MessageConstant.java b/src/main/java/vendingmachine/util/MessageConstant.java similarity index 89% rename from src/main/java/vendingmachine/MessageConstant.java rename to src/main/java/vendingmachine/util/MessageConstant.java index c9093e1f3..0298f410b 100644 --- a/src/main/java/vendingmachine/MessageConstant.java +++ b/src/main/java/vendingmachine/util/MessageConstant.java @@ -1,4 +1,4 @@ -package vendingmachine; +package vendingmachine.util; public class MessageConstant { public static final String INPUT_VENDING_MACHINE_HAS_MONEY_MSG = "자판기가 보유하고 있는 금액을 입력해 주세요."; diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index f0a4f370f..a8af6ad67 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -33,10 +33,12 @@ public static String inputProductDetail() { } public static int inputMoney() { + OutputView.printInputMoneyMsg(); return Integer.parseInt(Console.readLine()); } public static String inputPurchaseProduct() { + OutputView.printPurchaseProductInputMsg(); return Console.readLine(); } } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index e15d98d6a..0c901d4e3 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -1,6 +1,6 @@ package vendingmachine.view; -import vendingmachine.MessageConstant; +import vendingmachine.util.MessageConstant; import vendingmachine.domain.Coin; import java.util.HashMap; From f272a1d3c6becaef6fe8cfbd846a127d38f61040 Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Mon, 12 Dec 2022 18:27:26 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MachineController.java | 10 --- .../controller/MainController.java | 74 ++++++++++++------- .../java/vendingmachine/domain/Machine.java | 12 ++- .../java/vendingmachine/util/Constant.java | 2 +- .../java/vendingmachine/view/InputView.java | 1 + 5 files changed, 59 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/vendingmachine/controller/MachineController.java diff --git a/src/main/java/vendingmachine/controller/MachineController.java b/src/main/java/vendingmachine/controller/MachineController.java deleted file mode 100644 index 38dafe1de..000000000 --- a/src/main/java/vendingmachine/controller/MachineController.java +++ /dev/null @@ -1,10 +0,0 @@ -package vendingmachine.controller; - -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; - -public class MachineController { - -} diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index 6f607274e..02d958f42 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -16,59 +16,80 @@ public class MainController { public void run() { Machine machine = new Machine(); + List products = new ArrayList<>(); LinkedHashMap coinMap = machine.getCoins(); - int machineInputMoney = InputView.inputMachineHoldMoney(); // 1. 자판기 돈 입력 - machine.generateCoin(machineInputMoney); + generateMachineHasCoins(machine); OutputView.printMachineHasCoins(coinMap); - - List products = new ArrayList<>(); - OutputView.printProductDetailInputMsg(); - String[] productsInput = InputView.inputProductDetail().split(";"); // 2. 상품입력 - insertProduct(products, productsInput); + createProductInfo(products); int minProductPrice = getMinProductPrice(products); int userMoneyInput = InputView.inputMoney(); LinkedHashMap changeCoins = setChangeMap(); while (userMoneyInput > minProductPrice) { - OutputView.printCurrentInputMoney(userMoneyInput); // 현재 잔액을 출력함 - String purchasingProduct = InputView.inputPurchaseProduct(); // 어떤 상품을 구매할껀지 입력 - Product inputProduct = getProduct(products, purchasingProduct); - int productPrice = inputProduct.getPrice(); - userMoneyInput -= productPrice; + userMoneyInput = purchaseProduct(products, userMoneyInput); } OutputView.printCurrentInputMoney(userMoneyInput); - + + makeChange(coinMap, changeCoins, userMoneyInput); + OutputView.printChange(changeCoins); + } + + private static void makeChange(Map coinMap, Map changeCoins, int userMoneyInput) { while (userMoneyInput != 0) { - if (userMoneyInput >= 500 && coinMap.get(Coin.COIN_500) > 0) { - calculateChange(coinMap, Coin.COIN_500, changeCoins); + if (hasCoin(coinMap, userMoneyInput, 500)) { + calculateChange(coinMap, 500, changeCoins); userMoneyInput -= 500; continue; } - if (userMoneyInput >= 100 && coinMap.get(Coin.COIN_100) > 0) { - calculateChange(coinMap, Coin.COIN_100, changeCoins); + if (hasCoin(coinMap, userMoneyInput, 100)) { + calculateChange(coinMap, 100, changeCoins); userMoneyInput -= 100; continue; } - if (userMoneyInput >= 50 && coinMap.get(Coin.COIN_50) > 0) { - calculateChange(coinMap, Coin.COIN_50, changeCoins); + if (hasCoin(coinMap, userMoneyInput, 50)) { + calculateChange(coinMap, 50, changeCoins); userMoneyInput -= 50; continue; } - if (userMoneyInput >= 10 && coinMap.get(Coin.COIN_10) > 0) { - userMoneyInput = generateChange(coinMap, userMoneyInput, changeCoins); + if (hasCoin(coinMap, userMoneyInput, 10)) { + calculateChange(coinMap, 10, changeCoins); + userMoneyInput -= 10; continue; } if (checkRemainingCoins(coinMap)) break; } - OutputView.printChange(changeCoins); } + private static boolean hasCoin(Map coinMap, int userMoneyInput, int coin) { + return userMoneyInput >= coin && coinMap.get(Coin.valueOf(coin)) > 0; + } + + private static void createProductInfo(List products) { + String[] productsInput = InputView.inputProductDetail().split(";"); + insertProduct(products, productsInput); + } + + private static int purchaseProduct(List products, int userMoneyInput) { + OutputView.printCurrentInputMoney(userMoneyInput); // 현재 잔액을 출력함 + String purchasingProduct = InputView.inputPurchaseProduct(); // 어떤 상품을 구매할껀지 입력 + Product inputProduct = getProduct(products, purchasingProduct); + int productPrice = inputProduct.getPrice(); + userMoneyInput -= productPrice; + return userMoneyInput; + } + + private static void generateMachineHasCoins(Machine machine) { + int machineInputMoney = InputView.inputMachineHoldMoney(); // 1. 자판기 돈 입력 + machine.generateCoin(machineInputMoney); + } + + private static int generateChange(Map coinMap, int userMoneyInput ,Map changeCoins) { - calculateChange(coinMap, Coin.COIN_10, changeCoins); + calculateChange(coinMap, 10, changeCoins); userMoneyInput -= 10; return userMoneyInput; } - private static boolean checkRemainingCoins(LinkedHashMap coinMap) { + private static boolean checkRemainingCoins(Map coinMap) { return coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0; } @@ -84,7 +105,7 @@ private static int getMinProductPrice(List products) { private static void insertProduct(List products, String[] productsInput) { for (String product : productsInput) { - String productDetail = product.replaceAll(Constant.REX, ""); + String productDetail = product.replaceAll(Constant.REGEX, ""); String[] productInfo = productDetail.split(","); Product freshProduct = new Product(productInfo[0], Integer.parseInt(productInfo[1]), Integer.parseInt(productInfo[2])); products.add(freshProduct); @@ -106,7 +127,8 @@ private static Product getProduct(List products, String purchasingProdu return inputProduct; } - private static void calculateChange(Map coinMap, Coin coin, Map changeCoins) { + private static void calculateChange(Map coinMap, int inputCoin, Map changeCoins) { + Coin coin = Coin.valueOf(inputCoin); coinMap.put(coin, coinMap.get(coin) - 1); changeCoins.put(coin, changeCoins.get(coin) + 1); } diff --git a/src/main/java/vendingmachine/domain/Machine.java b/src/main/java/vendingmachine/domain/Machine.java index cbbd3dfdb..133644c66 100644 --- a/src/main/java/vendingmachine/domain/Machine.java +++ b/src/main/java/vendingmachine/domain/Machine.java @@ -38,17 +38,23 @@ private LinkedHashMap generateCoinMap() { */ public void generateCoin(int moneyInput) { List coinUnit = getCoinUnit(); + generateRandomCoin(moneyInput, coinUnit); + } + + private void generateRandomCoin(int moneyInput, List coinUnit) { while(moneyInput > 0) { int pickRandomNum = Randoms.pickNumberInList(coinUnit); Coin randomCoin = Coin.valueOf(pickRandomNum); - if (moneyInput - pickRandomNum < 0) { - continue; - } + if (isInputRemainingMoney(moneyInput, pickRandomNum)) continue; moneyInput -= pickRandomNum; coins.put(randomCoin, coins.get(randomCoin) + 1); } } + private static boolean isInputRemainingMoney(int moneyInput, int pickRandomNum) { + return moneyInput - pickRandomNum < 0; + } + private static List getCoinUnit() { List coinUnit = new ArrayList<>(); coinUnit.add(500); diff --git a/src/main/java/vendingmachine/util/Constant.java b/src/main/java/vendingmachine/util/Constant.java index 4b2a97626..820be4359 100644 --- a/src/main/java/vendingmachine/util/Constant.java +++ b/src/main/java/vendingmachine/util/Constant.java @@ -1,5 +1,5 @@ package vendingmachine.util; public class Constant { - public static final String REX= "[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9,]"; + public static final String REGEX= "[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9,]"; } diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index a8af6ad67..88a0a6c9b 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -29,6 +29,7 @@ public static int inputMachineHoldMoney() { * @return */ public static String inputProductDetail() { + OutputView.printProductDetailInputMsg(); return Console.readLine(); } From 192cc14a5b3628c73e9def91a3f2e7ae8dc3478a Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Mon, 12 Dec 2022 20:51:58 +0900 Subject: [PATCH 8/9] =?UTF-8?q?refactor:=20MainController=20run=20method?= =?UTF-8?q?=20=EC=84=B8=EB=B6=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Controller 필드 변수 추가 --- src/main/java/vendingmachine/Validator.java | 1 + .../controller/MainController.java | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/vendingmachine/Validator.java b/src/main/java/vendingmachine/Validator.java index 84934d8b7..c68209618 100644 --- a/src/main/java/vendingmachine/Validator.java +++ b/src/main/java/vendingmachine/Validator.java @@ -4,6 +4,7 @@ public class Validator { + private Validator () {} public static void validateMachineHasMoneyInput(String money) { if (Integer.parseInt(money) <= 0) { throw new IllegalArgumentException("[ERROR] 입력한 금액이 올바르지 않습니다."); diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index 02d958f42..c39564a04 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -14,25 +14,34 @@ import java.util.Map; public class MainController { + private final LinkedHashMap coinMap = generateRandomMachineCoin(); + private final LinkedHashMap changeCoins = setChangeMap(); + public void run() { - Machine machine = new Machine(); - List products = new ArrayList<>(); - LinkedHashMap coinMap = machine.getCoins(); - generateMachineHasCoins(machine); - OutputView.printMachineHasCoins(coinMap); + List products = new ArrayList<>(); // 상품 객체 생성 createProductInfo(products); int minProductPrice = getMinProductPrice(products); int userMoneyInput = InputView.inputMoney(); - LinkedHashMap changeCoins = setChangeMap(); while (userMoneyInput > minProductPrice) { userMoneyInput = purchaseProduct(products, userMoneyInput); } - OutputView.printCurrentInputMoney(userMoneyInput); + printChangeResult(coinMap, userMoneyInput, changeCoins); + } + private static void printChangeResult(LinkedHashMap coinMap, int userMoneyInput, LinkedHashMap changeCoins) { + OutputView.printCurrentInputMoney(userMoneyInput); makeChange(coinMap, changeCoins, userMoneyInput); OutputView.printChange(changeCoins); } + private static LinkedHashMap generateRandomMachineCoin() { + Machine machine = new Machine(); // 자판기 생성자 + LinkedHashMap coinMap = machine.getCoins(); // 거스름돈 map을 만들기 위해서 셋팅 + generateMachineHasCoins(machine); // 자판기가 가진 거스름돈을 만듬 + OutputView.printMachineHasCoins(coinMap); // 자판기가 가진 돈으로 생성한 거스름돈을 보여줌 + return coinMap; + } + private static void makeChange(Map coinMap, Map changeCoins, int userMoneyInput) { while (userMoneyInput != 0) { if (hasCoin(coinMap, userMoneyInput, 500)) { @@ -119,7 +128,7 @@ private static LinkedHashMap setChangeMap() { } private static Product getProduct(List products, String purchasingProduct) { - Product inputProduct = products.stream() // + Product inputProduct = products.stream() .filter(x -> x.getName().equals(purchasingProduct)) .findFirst() .orElse(null); From d64f101ea7f7fa4287fbf7d38dd9616e89b2d0f2 Mon Sep 17 00:00:00 2001 From: SEONGJOON KIM Date: Mon, 12 Dec 2022 21:34:38 +0900 Subject: [PATCH 9/9] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainController.java | 48 +++++++++---------- .../java/vendingmachine/domain/Machine.java | 17 ++----- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index c39564a04..8bdb5b608 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -14,8 +14,8 @@ import java.util.Map; public class MainController { - private final LinkedHashMap coinMap = generateRandomMachineCoin(); - private final LinkedHashMap changeCoins = setChangeMap(); + private static LinkedHashMap coinMap = generateRandomMachineCoin(); + private static LinkedHashMap changeCoins = setChangeMap(); public void run() { List products = new ArrayList<>(); // 상품 객체 생성 @@ -30,45 +30,45 @@ public void run() { private static void printChangeResult(LinkedHashMap coinMap, int userMoneyInput, LinkedHashMap changeCoins) { OutputView.printCurrentInputMoney(userMoneyInput); - makeChange(coinMap, changeCoins, userMoneyInput); + makeChange(userMoneyInput); OutputView.printChange(changeCoins); } private static LinkedHashMap generateRandomMachineCoin() { - Machine machine = new Machine(); // 자판기 생성자 - LinkedHashMap coinMap = machine.getCoins(); // 거스름돈 map을 만들기 위해서 셋팅 - generateMachineHasCoins(machine); // 자판기가 가진 거스름돈을 만듬 - OutputView.printMachineHasCoins(coinMap); // 자판기가 가진 돈으로 생성한 거스름돈을 보여줌 + Machine machine = new Machine(); + LinkedHashMap coinMap = machine.getCoins(); + generateMachineHasCoins(machine); + OutputView.printMachineHasCoins(coinMap); return coinMap; } - private static void makeChange(Map coinMap, Map changeCoins, int userMoneyInput) { + private static void makeChange(int userMoneyInput) { while (userMoneyInput != 0) { - if (hasCoin(coinMap, userMoneyInput, 500)) { - calculateChange(coinMap, 500, changeCoins); + if (hasCoin(userMoneyInput, 500)) { + calculateChange(500); userMoneyInput -= 500; continue; } - if (hasCoin(coinMap, userMoneyInput, 100)) { - calculateChange(coinMap, 100, changeCoins); + if (hasCoin(userMoneyInput, 100)) { + calculateChange(100); userMoneyInput -= 100; continue; } - if (hasCoin(coinMap, userMoneyInput, 50)) { - calculateChange(coinMap, 50, changeCoins); + if (hasCoin(userMoneyInput, 50)) { + calculateChange(50); userMoneyInput -= 50; continue; } - if (hasCoin(coinMap, userMoneyInput, 10)) { - calculateChange(coinMap, 10, changeCoins); + if (hasCoin(userMoneyInput, 10)) { + calculateChange(10); userMoneyInput -= 10; continue; } - if (checkRemainingCoins(coinMap)) break; + if (checkRemainingCoins()) break; } } - private static boolean hasCoin(Map coinMap, int userMoneyInput, int coin) { + private static boolean hasCoin(int userMoneyInput, int coin) { return userMoneyInput >= coin && coinMap.get(Coin.valueOf(coin)) > 0; } @@ -78,8 +78,8 @@ private static void createProductInfo(List products) { } private static int purchaseProduct(List products, int userMoneyInput) { - OutputView.printCurrentInputMoney(userMoneyInput); // 현재 잔액을 출력함 - String purchasingProduct = InputView.inputPurchaseProduct(); // 어떤 상품을 구매할껀지 입력 + OutputView.printCurrentInputMoney(userMoneyInput); + String purchasingProduct = InputView.inputPurchaseProduct(); Product inputProduct = getProduct(products, purchasingProduct); int productPrice = inputProduct.getPrice(); userMoneyInput -= productPrice; @@ -87,18 +87,18 @@ private static int purchaseProduct(List products, int userMoneyInput) { } private static void generateMachineHasCoins(Machine machine) { - int machineInputMoney = InputView.inputMachineHoldMoney(); // 1. 자판기 돈 입력 + int machineInputMoney = InputView.inputMachineHoldMoney(); machine.generateCoin(machineInputMoney); } private static int generateChange(Map coinMap, int userMoneyInput ,Map changeCoins) { - calculateChange(coinMap, 10, changeCoins); + calculateChange(10); userMoneyInput -= 10; return userMoneyInput; } - private static boolean checkRemainingCoins(Map coinMap) { + private static boolean checkRemainingCoins() { return coinMap.get(Coin.COIN_500) == 0 && coinMap.get(Coin.COIN_100) == 0 && coinMap.get(Coin.COIN_50) == 0 && coinMap.get(Coin.COIN_10) == 0; } @@ -136,7 +136,7 @@ private static Product getProduct(List products, String purchasingProdu return inputProduct; } - private static void calculateChange(Map coinMap, int inputCoin, Map changeCoins) { + private static void calculateChange(int inputCoin) { Coin coin = Coin.valueOf(inputCoin); coinMap.put(coin, coinMap.get(coin) - 1); changeCoins.put(coin, changeCoins.get(coin) + 1); diff --git a/src/main/java/vendingmachine/domain/Machine.java b/src/main/java/vendingmachine/domain/Machine.java index 133644c66..311969187 100644 --- a/src/main/java/vendingmachine/domain/Machine.java +++ b/src/main/java/vendingmachine/domain/Machine.java @@ -2,14 +2,11 @@ import camp.nextstep.edu.missionutils.Randoms; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; public class Machine { - /** - * 자판기 클래스에서는 필요한게 보유하고 있는 금액을 받는다. - * 받고 나서 랜덤으로 생성한 동전의 데이터만 갖고 있다. - * 그렇다면 코인은 List로 존재하여야 한다. - */ private LinkedHashMap coins; public Machine() { @@ -27,15 +24,9 @@ private LinkedHashMap generateCoinMap() { coinMap.put(Coin.COIN_50, 0); coinMap.put(Coin.COIN_10, 0); return coinMap; + } - /** - * 자판기가 갖고 있는 돈을 인자로 받아서 - * 코인을 하나씩 랜덤으로 생성한다. - * 랜덤으로 생성한 돈이 현재 보유한 돈 보다 크면 다시 시도한다. - * 보유한 돈이 0이되면 그만한다. - * @param moneyInput - */ public void generateCoin(int moneyInput) { List coinUnit = getCoinUnit(); generateRandomCoin(moneyInput, coinUnit);