From 3ca48b82442c928a659d3ff071034f64b78dddf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 03:04:21 +0900 Subject: [PATCH 01/17] =?UTF-8?q?docs(README.md):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 491aece1..a44d92d2 100644 --- a/README.md +++ b/README.md @@ -1 +1,39 @@ -# java-racingcar-precourse \ No newline at end of file +# java-racingcar-precourse + +# 기능 요구 사항 +초간단 자동차 경주 게임을 구현한다. +- 주어진 횟수 동안 n대의 자동차는 1칸씩 전진 또는 멈출 수 있다. +- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. + - 단 중복을 허용하지 않는다. +- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. +- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다. +- Exception 이 아닌 IllegalArgumentException , IllegalStateException 등과 같은 명확한 유형을 처리한다 + +# 기능 요구 사항 +- 경주 시작 + - **자동차 이름 입력 받기** (이름은 쉼표 기준으로 구분) + - 중복 검사 + - 이름이 중복값일 때 + - IllegalArgumentException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. + - "중복된 자동차의 이름이 있습니다." + - 중복값이 아닐 때 + - 경주 인원이 한 명일 때 + - IllegalStateException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. + - "경주는 두 명 이상일 때 할 수 있습니다." + - 경주 인원이 2명이상일 때 + - **시도 횟수 입력 받기** + - 숫자가 아닐 때, 정수가 아닐 때, 2미만일 때 + - IllegalArgumentException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. + - "숫자만 입력할 수 있습니다." + - "정수만 입력할 수 있습니다." + - "2이상의 숫자만 입력할 수 있습니다." + - 2이상일 때 + - 주사위 굴리기 + - 4미만일 때 + - doUnderNum(int diceNum); + - 4이상일 때 + - doAboveNum(int diceNum); \ No newline at end of file From 48e0ecf4daea35c8955dd95940c217ff6945e1ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 05:29:02 +0900 Subject: [PATCH 02/17] feat(Application): default setting --- src/main/java/Application.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..bdbffd53 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,5 @@ +public class Application { + public static void main(String[] args) { + + } +} From 539ad3419cb6677bcc0d04ab40535a3e211fc671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 05:29:37 +0900 Subject: [PATCH 03/17] feat(Car): default setting --- src/main/java/Car.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/Car.java diff --git a/src/main/java/Car.java b/src/main/java/Car.java new file mode 100644 index 00000000..a3157821 --- /dev/null +++ b/src/main/java/Car.java @@ -0,0 +1,21 @@ +public class Car { + private String name; + + public Car(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void move(){ + + } + + private boolean getRandomNum(){ + + } + + +} From e04ee931f516e673f677b6fc1591d8cf3de17d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 14:12:50 +0900 Subject: [PATCH 04/17] feat(Race): default setting --- src/main/java/Race.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/Race.java diff --git a/src/main/java/Race.java b/src/main/java/Race.java new file mode 100644 index 00000000..0b22d242 --- /dev/null +++ b/src/main/java/Race.java @@ -0,0 +1,25 @@ +public class Race { + private int raceNum; + + public void startRace(){ + registCar(); + int raceNum = getRaceCount(); + + } + public int getRaceCount(){ + + } + private String[] getCar(){ + + } + public void registCar(){ + String[] carList = getCar(); + for(String car: carList){ + + } + } + + + + +} From 39e30e7be3f15212a6502b6f1330b210e8727704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 14:13:08 +0900 Subject: [PATCH 05/17] feat(CarRepository): default setting --- src/main/java/CarRepository.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/CarRepository.java diff --git a/src/main/java/CarRepository.java b/src/main/java/CarRepository.java new file mode 100644 index 00000000..d10264d2 --- /dev/null +++ b/src/main/java/CarRepository.java @@ -0,0 +1,14 @@ +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class CarRepository { + private static final Map carList = new ConcurrentHashMap<>(); + + public void saveCar(){ + + } + + public void findByName(){ + + } +} From f67615a38f20fe75f68aad7465d037480abf4a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 14:13:21 +0900 Subject: [PATCH 06/17] feat(Validator): default setting --- src/main/java/Validator.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/Validator.java diff --git a/src/main/java/Validator.java b/src/main/java/Validator.java new file mode 100644 index 00000000..6d8d6ee8 --- /dev/null +++ b/src/main/java/Validator.java @@ -0,0 +1,24 @@ +public class Validator { + public void validateDuplicateCarName(){ + + } + + public void validateCarCount(){ + + } + + public void validateRaceCount(){ + validateIsNum(); + validateIsInt(); + validateUnderRaceNum(); + } + + private void validateIsNum(){ + } + + private void validateIsInt(){ + } + + private void validateUnderRaceNum(){ + } +} From b241c4e9e5556b96d9eda2b5bff94f86756694c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 14:54:25 +0900 Subject: [PATCH 07/17] feat(io): default Setting --- src/main/java/io/Input.java | 15 +++++++++++++++ src/main/java/io/Output.java | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/main/java/io/Input.java create mode 100644 src/main/java/io/Output.java diff --git a/src/main/java/io/Input.java b/src/main/java/io/Input.java new file mode 100644 index 00000000..88c93c5e --- /dev/null +++ b/src/main/java/io/Input.java @@ -0,0 +1,15 @@ +package io; + +import java.util.Scanner; + +public class Input { + private Scanner scanner = new Scanner(System.in); + + public String getCarName(){ + + } + + public String getRaceCount(){ + + } +} diff --git a/src/main/java/io/Output.java b/src/main/java/io/Output.java new file mode 100644 index 00000000..edb96dbd --- /dev/null +++ b/src/main/java/io/Output.java @@ -0,0 +1,12 @@ +package io; + +public class Output { + public void printRace(){ + + } + + public void printWinner(){ + + } +} + From fa575ae6004e586b6e933cb1b5c55905a7b9d12d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Sun, 9 Jun 2024 21:51:51 +0900 Subject: [PATCH 08/17] =?UTF-8?q?refactor(README):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index a44d92d2..b981d675 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,25 @@ # 기능 요구 사항 - 경주 시작 - **자동차 이름 입력 받기** (이름은 쉼표 기준으로 구분) - - 중복 검사 - - 이름이 중복값일 때 + - 경주 인원이 한 명일 때 + - IllegalStateException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. + - "경주는 두 명 이상일 때 할 수 있습니다." + - 경주 인원이 2명이상일 때 + - 이름 중복 검사, 이름 제한 검사 + - 이름이 중복값일 때, 자동차 이름이 5글자 이상일 떄 - IllegalArgumentException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. - "중복된 자동차의 이름이 있습니다." - - 중복값이 아닐 때 - - 경주 인원이 한 명일 때 - - IllegalStateException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. - - "경주는 두 명 이상일 때 할 수 있습니다." - - 경주 인원이 2명이상일 때 - - **시도 횟수 입력 받기** - - 숫자가 아닐 때, 정수가 아닐 때, 2미만일 때 - - IllegalArgumentException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. - - "숫자만 입력할 수 있습니다." - - "정수만 입력할 수 있습니다." - - "2이상의 숫자만 입력할 수 있습니다." - - 2이상일 때 - - 주사위 굴리기 - - 4미만일 때 - - doUnderNum(int diceNum); - - 4이상일 때 - - doAboveNum(int diceNum); \ No newline at end of file + - "자동차 이름은 5글자 이하만 가능합니다." + - 검사 통과했을 때 + - **시도 횟수 입력 받기** + - 숫자가 아닐 때, 2미만일 때 + - IllegalArgumentException, [ERROR]로 시작하는 에러 메세지 출력, 다시 입력을 받는다. + - "숫자만 입력할 수 있습니다." + - "정수만 입력할 수 있습니다." + - "2이상의 숫자만 입력할 수 있습니다." + - 검사 통과했을 때 + - 주사위 굴리기 + - 4미만일 때 + - doUnderNum(int diceNum); + - 4이상일 때 + - doAboveNum(int diceNum); From 09bc75233ebc8a017d7648c7aaf54f1a90071908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 00:49:18 +0900 Subject: [PATCH 09/17] =?UTF-8?q?feat(Car):=20Car=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Car.java | 21 --------------------- src/main/java/domain/Car.java | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/Car.java create mode 100644 src/main/java/domain/Car.java diff --git a/src/main/java/Car.java b/src/main/java/Car.java deleted file mode 100644 index a3157821..00000000 --- a/src/main/java/Car.java +++ /dev/null @@ -1,21 +0,0 @@ -public class Car { - private String name; - - public Car(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void move(){ - - } - - private boolean getRandomNum(){ - - } - - -} diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java new file mode 100644 index 00000000..7519c037 --- /dev/null +++ b/src/main/java/domain/Car.java @@ -0,0 +1,31 @@ +package domain; + +import java.util.Random; + +public class Car { + private String name; + private int location = 0; + + public Car(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public int getLocation() { + return location; + } + + public void move(){ + if (getRandomNum() >= 4){ + location += 1; + } + } + + private int getRandomNum(){ + Random random = new Random(); + return random.nextInt(9); + } +} From 2156ab3f8874276d2ebc21d8e0a92680ee348b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 00:50:01 +0900 Subject: [PATCH 10/17] =?UTF-8?q?feat(io):=20Input/Output=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/Input.java | 8 +++++++- src/main/java/io/Output.java | 20 +++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/Input.java b/src/main/java/io/Input.java index 88c93c5e..9d1002a7 100644 --- a/src/main/java/io/Input.java +++ b/src/main/java/io/Input.java @@ -6,10 +6,16 @@ public class Input { private Scanner scanner = new Scanner(System.in); public String getCarName(){ - + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + return scanner.next(); } public String getRaceCount(){ + System.out.println("시도할 횟수는 몇회인가요?"); + return scanner.next(); + } + public String deleteSpace(String raceInput){ + return raceInput.replace(" ", ""); } } diff --git a/src/main/java/io/Output.java b/src/main/java/io/Output.java index edb96dbd..b8af3fc5 100644 --- a/src/main/java/io/Output.java +++ b/src/main/java/io/Output.java @@ -1,12 +1,26 @@ package io; -public class Output { - public void printRace(){ +import domain.Car; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +public class Output { + public void printRace(String carName, int progress){ + String progressBar = "-".repeat(progress); + System.out.println(carName + " : " + progressBar); } - public void printWinner(){ + public void printWinner(List winner){ + String winnerNames = winner.stream() + .map(Car::getName) + .collect(Collectors.joining(", ")); + + System.out.println("최종 우승자 : " + winnerNames); + } + public void print(String any){ + System.out.println(any); } } From cef4f8edfa842fff43c4d86be3cce8b7bb3427c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 00:50:39 +0900 Subject: [PATCH 11/17] =?UTF-8?q?feat(CarRepository):=20CarRepository=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/CarRepository.java | 14 ------------- src/main/java/repository/CarRepository.java | 22 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/CarRepository.java create mode 100644 src/main/java/repository/CarRepository.java diff --git a/src/main/java/CarRepository.java b/src/main/java/CarRepository.java deleted file mode 100644 index d10264d2..00000000 --- a/src/main/java/CarRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class CarRepository { - private static final Map carList = new ConcurrentHashMap<>(); - - public void saveCar(){ - - } - - public void findByName(){ - - } -} diff --git a/src/main/java/repository/CarRepository.java b/src/main/java/repository/CarRepository.java new file mode 100644 index 00000000..5c09b059 --- /dev/null +++ b/src/main/java/repository/CarRepository.java @@ -0,0 +1,22 @@ +package repository; + +import domain.Car; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class CarRepository { + private static final Map carList = new LinkedHashMap<>(); + + public List findAllCar(){ + return new ArrayList<>(carList.values()); + } + + public void saveCar(Car car){ + carList.put(car.getName(), car); + } + + public void findByName(){ + } +} From 95863bb1ea104533bcedb7c93c81d288d037ca5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 00:51:46 +0900 Subject: [PATCH 12/17] =?UTF-8?q?feat(Validator):=20Validator=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Validator.java | 24 ----------- src/main/java/validate/Validator.java | 61 +++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 24 deletions(-) delete mode 100644 src/main/java/Validator.java create mode 100644 src/main/java/validate/Validator.java diff --git a/src/main/java/Validator.java b/src/main/java/Validator.java deleted file mode 100644 index 6d8d6ee8..00000000 --- a/src/main/java/Validator.java +++ /dev/null @@ -1,24 +0,0 @@ -public class Validator { - public void validateDuplicateCarName(){ - - } - - public void validateCarCount(){ - - } - - public void validateRaceCount(){ - validateIsNum(); - validateIsInt(); - validateUnderRaceNum(); - } - - private void validateIsNum(){ - } - - private void validateIsInt(){ - } - - private void validateUnderRaceNum(){ - } -} diff --git a/src/main/java/validate/Validator.java b/src/main/java/validate/Validator.java new file mode 100644 index 00000000..73c8a3c7 --- /dev/null +++ b/src/main/java/validate/Validator.java @@ -0,0 +1,61 @@ +package validate; + +import java.util.Arrays; + +public class Validator { + + public boolean validateRaceInput(String raceInput, char symbol, int carNameNum){ + validateCarCount(raceInput, symbol); + validateDuplicateCarName(raceInput, symbol); + validateUnderCarNum(raceInput, symbol, carNameNum); + return true; + } + private void validateCarCount(String raceInput, char symbol) { + long carCount = raceInput.chars() + .filter(letter -> letter == symbol) + .count(); + + if (carCount < 1){ + throw new IllegalStateException("[ERROR] 경주는 두 명 이상일 때 할 수 있습니다."); + } + } + + private void validateDuplicateCarName(String raceInput, char symbol) { + String[] carList = raceInput.split(Character.toString(symbol)); + long distinctCarCount = Arrays.stream(carList).distinct().count(); + long totalCarCount = carList.length; + if(distinctCarCount != totalCarCount){ + throw new IllegalArgumentException("[ERROR] 중복된 자동차의 이름이 있습니다."); + } + } + + private void validateUnderCarNum(String raceInput, char symbol, int carNameNum) { + String[] carList = raceInput.split(Character.toString(symbol)); + for (String carName : carList){ + if(carName.length() > carNameNum){ + throw new IllegalArgumentException("[ERROR] 자동차 이름은 5글자 이하만 가능합니다. 이름 초과 : " + carName); + } + } + } + + public boolean validateRaceCount(String raceNum) { + validateIsNum(raceNum); + validateUnderRaceNum(raceNum); + return true; + } + + private void validateIsNum(String raceNum) { + for (char c : raceNum.toCharArray()){ + if(!Character.isDigit(c)){ + throw new IllegalArgumentException("[ERROR] 숫자만 입력할 수 있습니다."); + } + } + } + + private void validateUnderRaceNum(String raceNum) { + int intRaceNum = Integer.parseInt(raceNum); + if (intRaceNum < 2){ + throw new IllegalArgumentException("[ERROR] 2이상의 숫자만 입력할 수 있습니다."); + } + } +} From 6a3e1a0df81abf1898cefec390cb1a5d9806c423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 00:52:09 +0900 Subject: [PATCH 13/17] =?UTF-8?q?feat(Race):=20Race=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Race.java | 25 --------- src/main/java/service/Race.java | 93 +++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/Race.java create mode 100644 src/main/java/service/Race.java diff --git a/src/main/java/Race.java b/src/main/java/Race.java deleted file mode 100644 index 0b22d242..00000000 --- a/src/main/java/Race.java +++ /dev/null @@ -1,25 +0,0 @@ -public class Race { - private int raceNum; - - public void startRace(){ - registCar(); - int raceNum = getRaceCount(); - - } - public int getRaceCount(){ - - } - private String[] getCar(){ - - } - public void registCar(){ - String[] carList = getCar(); - for(String car: carList){ - - } - } - - - - -} diff --git a/src/main/java/service/Race.java b/src/main/java/service/Race.java new file mode 100644 index 00000000..3389e74d --- /dev/null +++ b/src/main/java/service/Race.java @@ -0,0 +1,93 @@ +package service; + +import domain.Car; +import io.Input; +import io.Output; +import java.util.ArrayList; +import java.util.List; +import repository.CarRepository; +import validate.Validator; + +public class Race { + + private int raceNum; + private String raceInput; + private static final int CAR_NAME_NUM = 5; + private static final char INPUT_SYMBOL = ','; + private final Input input; + private final Output output; + private final Validator validator; + + private final CarRepository carRepository; + + public Race(Input input, Output output, Validator validator, CarRepository carRepository) { + this.input = input; + this.output = output; + this.validator = validator; + this.carRepository = carRepository; + } + + public void execute() { + raceInput = input.getCarName(); + while (!validator.validateRaceInput(input.deleteSpace(raceInput), INPUT_SYMBOL, + CAR_NAME_NUM)) { + raceInput = input.getCarName(); + } + registCar(raceInput); + + String stringRaceNum = input.getRaceCount(); + while (!validator.validateRaceCount(stringRaceNum)) { + stringRaceNum = input.getRaceCount(); + } + raceNum = Integer.parseInt(stringRaceNum); + List carList = carRepository.findAllCar(); + + output.print("실행 결과"); + raceStart(carList); + + List winnerList = getWinner(); + output.printWinner(winnerList); + } + + public void registCar(String raceInput) { + String[] carList = raceInput.split(Character.toString(INPUT_SYMBOL)); + for (String stringCar : carList) { + Car car = new Car(stringCar); + carRepository.saveCar(car); + } + } + + public void raceStart(List carList) { + for (int i = 0; i < raceNum; i++) { + carList.stream().forEach(car -> { + car.move(); + output.printRace(car.getName(), car.getLocation()); + }); + output.print(""); + } + } + + public List getWinner() { + List winnerList = new ArrayList<>(); + List carList = carRepository.findAllCar(); + int maxLocation = findMaxLocation(); + for (Car car : carList) { + if (car.getLocation() == maxLocation) { + winnerList.add(car); + } + } + return winnerList; + } + + private int findMaxLocation() { + int maxLocation = 0; + List carList = carRepository.findAllCar(); + for (Car car : carList) { + int carLocation = car.getLocation(); + if (maxLocation < carLocation) { + maxLocation = carLocation; + } + } + return maxLocation; + } +} From bf217a40bbfe017673d8c8269aa5097ab867f143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 00:52:28 +0900 Subject: [PATCH 14/17] =?UTF-8?q?feat(Application):=20Application=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index bdbffd53..fdae3a29 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,5 +1,12 @@ +import io.Input; +import io.Output; +import repository.CarRepository; +import service.Race; +import validate.Validator; + public class Application { public static void main(String[] args) { - + Race race = new Race(new Input(), new Output(), new Validator(), new CarRepository()); + race.execute(); } } From e285d869a83afe59d9bdc32092de738783cf22b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 01:59:17 +0900 Subject: [PATCH 15/17] =?UTF-8?q?refactor(Input):=20=EC=9E=85=EB=A0=A5=20n?= =?UTF-8?q?ext()=20->=20nextLine()=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/Input.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/Input.java b/src/main/java/io/Input.java index 9d1002a7..9378d2a9 100644 --- a/src/main/java/io/Input.java +++ b/src/main/java/io/Input.java @@ -7,12 +7,12 @@ public class Input { public String getCarName(){ System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); - return scanner.next(); + return scanner.nextLine(); } public String getRaceCount(){ System.out.println("시도할 횟수는 몇회인가요?"); - return scanner.next(); + return scanner.nextLine(); } public String deleteSpace(String raceInput){ From 409bb637a6b33bc124ae3dce4dee95365caf54e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 02:00:21 +0900 Subject: [PATCH 16/17] =?UTF-8?q?refactor(Race):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B0=92=20=EB=8B=A4=EC=8B=9C=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/service/Race.java | 38 +++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/service/Race.java b/src/main/java/service/Race.java index 3389e74d..b1f18ea3 100644 --- a/src/main/java/service/Race.java +++ b/src/main/java/service/Race.java @@ -28,18 +28,9 @@ public Race(Input input, Output output, Validator validator, CarRepository carRe } public void execute() { - raceInput = input.getCarName(); - while (!validator.validateRaceInput(input.deleteSpace(raceInput), INPUT_SYMBOL, - CAR_NAME_NUM)) { - raceInput = input.getCarName(); - } - registCar(raceInput); + getCarName(); + getRaceCount(); - String stringRaceNum = input.getRaceCount(); - while (!validator.validateRaceCount(stringRaceNum)) { - stringRaceNum = input.getRaceCount(); - } - raceNum = Integer.parseInt(stringRaceNum); List carList = carRepository.findAllCar(); output.print("실행 결과"); @@ -49,6 +40,31 @@ public void execute() { output.printWinner(winnerList); } + private void getCarName(){ + while (true) { + try { + raceInput = input.getCarName(); + validator.validateRaceInput(input.deleteSpace(raceInput), INPUT_SYMBOL, CAR_NAME_NUM); + registCar(raceInput); + break; + } catch (IllegalArgumentException | IllegalStateException e) { + output.print(e.getMessage()); + } + } + } + + private void getRaceCount(){ + while (true) { + try { + String stringRaceNum = input.getRaceCount(); + validator.validateRaceCount(stringRaceNum); + raceNum = Integer.parseInt(stringRaceNum); + break; + } catch (IllegalArgumentException | IllegalStateException e) { + output.print(e.getMessage()); + } + } + } public void registCar(String raceInput) { String[] carList = raceInput.split(Character.toString(INPUT_SYMBOL)); for (String stringCar : carList) { From c93c0a377109d5a0b91b791a389605e3d5ff1eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EB=AF=BC=EA=B7=9C?= Date: Mon, 10 Jun 2024 02:00:55 +0900 Subject: [PATCH 17/17] =?UTF-8?q?feat:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/validate/ValidatorTest.java | 73 +++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/validate/ValidatorTest.java diff --git a/src/test/java/validate/ValidatorTest.java b/src/test/java/validate/ValidatorTest.java new file mode 100644 index 00000000..fe6259bb --- /dev/null +++ b/src/test/java/validate/ValidatorTest.java @@ -0,0 +1,73 @@ +package validate; + +import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class ValidatorTest { + Validator validator = new Validator(); + char symbol = ','; + int carNameNum = 5; + @Test + void 경주_인원() { + //given + String raceInput = "a"; + //when + Throwable exception = assertThrows(IllegalStateException.class, () ->{ + validator.validateRaceInput(raceInput, symbol, carNameNum); + }); + //then + assertThat("[ERROR] 경주는 두 명 이상일 때 할 수 있습니다.").isEqualTo(exception.getMessage()); + } + + @Test + void 이름_중복_검사(){ + //given + String raceInput = "a,a,b"; + //when + Throwable exception = assertThrows(IllegalArgumentException.class, () ->{ + validator.validateRaceInput(raceInput, symbol, carNameNum); + }); + //then + assertThat("[ERROR] 중복된 자동차의 이름이 있습니다.").isEqualTo(exception.getMessage()); + } + + @Test + void 이름_글자수_검사(){ + //given + String raceInput = "aaaaa,bbbbbb"; + //when + Throwable exception = assertThrows(IllegalArgumentException.class, () ->{ + validator.validateRaceInput(raceInput, symbol, carNameNum); + }); + //then + assertThat("[ERROR] 자동차 이름은 5글자 이하만 가능합니다. 이름 초과 : " + "bbbbbb").isEqualTo(exception.getMessage()); + } + + @Test + void 시도_횟수_숫자() { + //given + String raceNum = "a"; + //when + Throwable exception = assertThrows(IllegalArgumentException.class, () ->{ + validator.validateRaceCount(raceNum); + }); + //then + assertThat("[ERROR] 숫자만 입력할 수 있습니다.").isEqualTo(exception.getMessage()); + } + + @Test + void 시도_횟수_2미만() { + //given + String raceNum = "1"; + //when + Throwable exception = assertThrows(IllegalArgumentException.class, () ->{ + validator.validateRaceCount(raceNum); + }); + //then + assertThat("[ERROR] 2이상의 숫자만 입력할 수 있습니다.").isEqualTo(exception.getMessage()); + } +} \ No newline at end of file