Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions src/main/java/calculator/application/CalculatorApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package calculator.application;

import calculator.domain.Calculator;
import calculator.domain.InputMachine;
import calculator.view.ScreenMassage;

public class CalculatorApp {
public static void main(String[] args) {
InputMachine inputMachine = new InputMachine();
Calculator calculator = new Calculator();
ScreenMassage screen = new ScreenMassage();

screen.showMassage();

int answer = 0;
try {
String userInput = inputMachine.getUserInput();
answer = calculator.getTotalCalculation(userInput);
} catch (Exception e) {
screen.showErrorMassage(e);
}

screen.showResult(answer);
}
}
59 changes: 59 additions & 0 deletions src/main/java/calculator/domain/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package calculator.domain;

public class Calculator {
public int getTotalCalculation(String arithmeticOperation) {
StringReader reader = new StringReader();

int[] numbers = reader.extractNumber(arithmeticOperation);
String[] operators = reader.extractOperator(arithmeticOperation);

int answer = 0;

for (int i = 0; i < operators.length; i += 1) {
if (operators[i].equals("+")) {
int value = this.add(numbers[i], numbers[i + 1]);
numbers[i + 1] = value;
answer = value;
continue;
}

if (operators[i].equals("-")) {
int value = this.subtract(numbers[i], numbers[i + 1]);
numbers[i + 1] = value;
answer = value;
continue;
}

if (operators[i].equals("*")) {
int value = this.multiply(numbers[i], numbers[i + 1]);
numbers[i + 1] = value;
answer = value;
continue;
}

if (operators[i].equals("/")) {
int value = this.divide(numbers[i], numbers[i + 1]);
numbers[i + 1] = value;
answer = value;
}
}

return answer;
}

public int add(int a, int b) {
return a + b;
}

public int subtract(int a, int b) {
return a - b;
}

public int multiply(int a, int b) {
return a * b;
}

public int divide(int a, int b) {
return a / b;
}
}
20 changes: 20 additions & 0 deletions src/main/java/calculator/domain/InputMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package calculator.domain;

import java.util.Scanner;

public class InputMachine {
public String getUserInput() {
Scanner input = new Scanner(System.in);
String userInput = input.nextLine();

validateUserInput(userInput);

return userInput;
}

public void validateUserInput(String str) {
if (str == null || str == "") {
throw new IllegalArgumentException();
}
}
}
104 changes: 104 additions & 0 deletions src/main/java/calculator/domain/StringReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package calculator.domain;

import java.util.*;
import java.util.regex.*;

public class StringReader {
public int[] extractNumber(String str) {
if (this.checkWeird(str)) {
throw new IllegalArgumentException();
}

String[] arr = str.split(" ");

removeUnnecessaryParts(arr);
ArrayList<String> pureNumbers = convertArrayToArrayList(arr);
ArrayList<String> result = considerBracket(pureNumbers);

return extractNumbersFromBracket(result);
}

public String[] extractOperator(String str) {
if (this.checkWeird(str)) {
throw new IllegalArgumentException();
}

String[] arr = str.split(" ");

ArrayList<String> pureOperators = convertArrayToArrayList(arr);
Object[] objOperators = pureOperators.stream()
.filter(v -> Pattern.matches("[\\*\\-\\+\\/]", v))
.toArray();

return convertObjectArrayToStringArray(objOperators);
}

public boolean checkWeird(String str) {
String weirds = str.replaceAll("[0-9\\+\\-\\*\\/\\' '\\(\\)]", "");
return weirds.length() > 0;
}

private void removeUnnecessaryParts(String[] arr) {
for (int i = 0; i < arr.length; i += 1) {
arr[i] = arr[i].replaceAll("[^0-9\\-\\(\\)]", "");
}
}

private ArrayList<String> convertArrayToArrayList(String[] arr) {
ArrayList<String> arrayList = new ArrayList<>();

for (String e : arr) {
arrayList.add(e);
}

return arrayList;
}

private String[] convertObjectArrayToStringArray(Object[] objArr) {
String[] strArr = new String[objArr.length];

int index = 0;
for (Object operator: objArr) {
strArr[index] = operator.toString();
index += 1;
}

return strArr;
}

private ArrayList<String> considerBracket(ArrayList<String> arrayList) {
ArrayList<String> result = new ArrayList<>();

for (int i = 0; i < arrayList.size(); i += 1) {
String e = arrayList.get(i);
if (e.length() > 0 && e.charAt(0) == '(') {
result.add(e);
continue;
}

if (Pattern.matches("[0-9]{1,}", e)) {
result.add(e);
}
}

return result;
}

private int[] extractNumbersFromBracket(ArrayList<String> arrayList) {
int[] answer = new int[arrayList.size()];

for (int i = 0; i < answer.length; i += 1) {
String e = arrayList.get(i);

if (e.charAt(0) == '(') {
String substr = e.substring(1, e.length() - 1);
answer[i] = Integer.parseInt(substr);
continue;
}

answer[i] = Integer.parseInt(e);
}

return answer;
}
}
15 changes: 15 additions & 0 deletions src/main/java/calculator/view/ScreenMassage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package calculator.view;

public class ScreenMassage {
public void showMassage() {
System.out.println("수식을 입력해주세요. 계산은 제가 합니다 ㅋ");
}

public void showResult(int result) {
System.out.printf("답은 %d 입니다.", result);
}

public void showErrorMassage(Exception e) {
System.out.println(e);
}
}
Empty file removed src/main/java/empty.txt
Empty file.
32 changes: 32 additions & 0 deletions src/main/java/racingcar/controller/RacingCarApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package racingcar.controller;

import racingcar.domain.Car;
import racingcar.domain.CarList;
import racingcar.view.InputView;
import racingcar.view.ResultView;

import java.util.Arrays;

public class RacingCarApp {
public static void main(String[] args) {
InputView inputView = new InputView();

inputView.whatCarNamesAre();
String nameOfCars = inputView.getUserStringInput();
inputView.howManyTimes();
int numberOfTimes = inputView.getUserIntInput();

CarList carList = new CarList(nameOfCars);
ResultView resultView = new ResultView();


for (int i = 0; i < numberOfTimes; i += 1) {
resultView.clear();
carList.moveAllCars();
resultView.showResult(carList.getCars());
resultView.sleep(1000);
}

resultView.showWinner(carList.getWinners());
}
}
29 changes: 29 additions & 0 deletions src/main/java/racingcar/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package racingcar.domain;

public class Car implements Comparable {
private int status = 0;
private final String name;

public Car(String carName) {
this.name = carName;
}

public void move(int randomNumber) {
if (randomNumber >= 4) {
this.status += 1;
}
}

public int getStatus() {
return this.status;
}

public String getName() {
return this.name;
}

public int compareTo(Object obj) {
Car car = (Car)obj;
return this.status < car.getStatus() ? 1 : -1;
}
}
49 changes: 49 additions & 0 deletions src/main/java/racingcar/domain/CarList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package racingcar.domain;

import racingcar.domain.Car;

import java.util.ArrayList;
import java.util.Arrays;

public class CarList {
private final Car[] cars;

public CarList(String carNames) {
String[] names = carNames.split(",");
this.cars = new Car[names.length];

for (int i = 0; i < names.length; i += 1) {
this.cars[i] = new Car(names[i]);
}
}

public Car[] getCars() {
return this.cars;
}

public void moveAllCars() {
RandomGenerator randomGenerator = new RandomGenerator();
for (Car car : cars) {
car.move(randomGenerator.get());
}
}

public Object[] getWinners() {
Arrays.sort(this.cars);
int winnerStatus = this.cars[0].getStatus();

ArrayList<String> winners = new ArrayList<>();

for (Car car : this.cars) {
addWinner(winners, car, winnerStatus);
}

return winners.toArray();
}

public void addWinner(ArrayList<String> winners, Car current, int winnerStatus) {
if (current.getStatus() == winnerStatus) {
winners.add(current.getName());
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/racingcar/domain/RandomGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package racingcar.domain;

import java.util.Random;

public class RandomGenerator {
public int get() {
Random random = new Random();
return Math.abs(random.nextInt()) % 9;
}
}
28 changes: 28 additions & 0 deletions src/main/java/racingcar/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package racingcar.view;

import java.util.Scanner;

public class InputView {
public int getUserIntInput() {
try {
Scanner input = new Scanner(System.in);
return input.nextInt();
} catch (Exception e) {
System.out.println("숫자로 다시 입력해주세요");
return this.getUserIntInput();
}
}

public String getUserStringInput() {
Scanner input = new Scanner(System.in);
return input.nextLine();
}

public void whatCarNamesAre() {
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분합니다)");
}

public void howManyTimes() {
System.out.println("몇 번 시도하시겠습니까?");
}
}
Loading