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.
27 changes: 27 additions & 0 deletions src/main/java/racingcar/application/RacingCarApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package racingcar.application;

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

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

inputView.howManyCars();
int numberOfCars = inputView.getUserInput();
inputView.howManyTimes();
int numberOfTimes = inputView.getUserInput();

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

for (int i = 0; i < numberOfTimes; i += 1) {
carList.moveAllCars();

Car[] cars = carList.getCars();
resultView.showResult(cars);
}
}
}
15 changes: 15 additions & 0 deletions src/main/java/racingcar/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package racingcar.domain;

public class Car {
private int status = 0;

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

public int getStatus() {
return this.status;
}
}
28 changes: 28 additions & 0 deletions src/main/java/racingcar/domain/CarList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package racingcar.domain;

import racingcar.domain.Car;

import java.util.ArrayList;

public class CarList {
private final Car[] cars;

public CarList(int number) {
cars = new Car[number];

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

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

public void moveAllCars() {
RandomGenerator randomGenerator = new RandomGenerator();
for (Car car : cars) {
car.move(randomGenerator.get());
}
}
}
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;
}
}
23 changes: 23 additions & 0 deletions src/main/java/racingcar/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package racingcar.view;

import java.util.Scanner;

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

public void howManyCars() {
System.out.println("경주용 자동차는 총 몇 대입니까?");
}

public void howManyTimes() {
System.out.println("몇 번 시도하시겠습니까?");
}
}
18 changes: 18 additions & 0 deletions src/main/java/racingcar/view/ResultView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package racingcar.view;

import racingcar.domain.Car;

public class ResultView {
public void showResult(Car[] cars) {
int count = 1;
for (Car car : cars) {
System.out.printf("[%d]RacingCar) ", count);
for (int i = 0; i < car.getStatus(); i += 1) {
System.out.print("-");
}
System.out.println("");
count += 1;
}
System.out.println("──────────────────────");
}
}
40 changes: 40 additions & 0 deletions src/test/java/calculator/CalculatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package calculator;

import calculator.domain.Calculator;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

@DisplayName("Calculator")
public class CalculatorTest {
Calculator calculator = new Calculator();

@Test
@DisplayName("add")
public void add() {
assertThat(calculator.add(1, 1)).isEqualTo(2);
assertThat(calculator.add(-1, 1)).isEqualTo(0);
}

@Test
@DisplayName("subtract")
public void subtract() {
assertThat(calculator.subtract(1, 1)).isEqualTo(0);
assertThat(calculator.subtract(-1, 1)).isEqualTo(-2);
}

@Test
@DisplayName("multiply")
public void multiply() {
assertThat(calculator.multiply(2, 2)).isEqualTo(4);
assertThat(calculator.multiply(-2, 5)).isEqualTo(-10);
}

@Test
@DisplayName("divide")
public void divide() {
assertThat(calculator.divide(6, 2)).isEqualTo(3);
assertThat(calculator.divide(3, 2)).isEqualTo(1);
}
}
Loading