From 9deb0429d343259336f469f83ea440b3a8a1cd7b Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Fri, 28 Jan 2022 14:57:35 +0900 Subject: [PATCH 1/6] =?UTF-8?q?docs:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=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 --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 8fe7112..0eec09a 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,32 @@ git checkout main // 기본 브랜치가 main인 경우 git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` +요구사항 +사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해야 한다. +문자열 계산기는 사칙연산의 계산 우선순위가 아닌 입력 값에 따라 계산 순서가 결정된다. +즉, 수학에서는 곱셈, 나눗셈이 덧셈, 뺄셈 보다 먼저 계산해야 하지만 이를 무시한다. +예를 들어 "2 + 3 * 4 / 2"와 같은 문자열을 입력할 경우 2 + 3 * 4 / 2 실행 결과인 10을 출력해야 한다. + +힌트 +문자열을 입력 받은 후(scanner의 nextLine() 메소드 활용) 빈 공백 문자열을 기준으로 문자들을 분리해야 한다. +String value = scanner.nextLine(); +String[] values = value.split(" "); +문자열을 숫자로 변경하는 방법 +int number = Integer.parseInt("문자열"); + +- 단순 계산기(SimpleCalculator) + - [x] 주어진 사칙연산기호를 통해 두 개의 숫자를 계산한다. + - 사칙연산 기호(symbol) + - [x] `+`->두 개의 숫자를 덧셈 + - [x] `-`->두 개의 숫자를 뺄셈 + - [x] `*`->두 개의 숫자를 곱셈 + - [x] `/`->두 개의 숫자를 나눗셈 + - [x] 0으로 나누면 throw new ArithmeticException(); + +- 방정식 (Equation) + - [x] 문자열을 문자들로 분리 + - [x] 분리된 문자들 중 숫자만 반환 + - [x] 분리된 문자들 중 연산기호만 반환 + +- 문자열 계산기() + - [ ] 문자열 변환기와 단순 계산기를 통해 계산된 결과를 보여준다. From 4c2fc9056d75cd20664c3a1493e65309f9b12a26 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Fri, 28 Jan 2022 14:59:32 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EB=B0=A9=EC=A0=95=EC=8B=9D?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4.=20=20=20=20-=20[x]=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=84=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EB=93=A4=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=20=20=20=20-=20[x]?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC=EB=90=9C=20=EB=AC=B8=EC=9E=90=EB=93=A4=20?= =?UTF-8?q?=EC=A4=91=20=EC=88=AB=EC=9E=90=EB=A7=8C=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=20=20=20=20-=20[x]=20=EB=B6=84=EB=A6=AC=EB=90=9C=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EB=93=A4=20=EC=A4=91=20=EC=97=B0=EC=82=B0=EA=B8=B0?= =?UTF-8?q?=ED=98=B8=EB=A7=8C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/Equation.java | 82 +++++++++++++++++++++++++++ src/test/java/study/EquationTest.java | 41 ++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/main/java/study/Equation.java create mode 100644 src/test/java/study/EquationTest.java diff --git a/src/main/java/study/Equation.java b/src/main/java/study/Equation.java new file mode 100644 index 0000000..e9193c3 --- /dev/null +++ b/src/main/java/study/Equation.java @@ -0,0 +1,82 @@ +package study; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Equation { + + private final String equation; + + private static final String INVALID_CALCULATION_FORMAT = "잘못된 계산식입니다."; + private static final String DELIMITER = " "; + + public Equation(String equation) { + this.equation = equation; + checkEquation(); + } + + public void checkEquation() { + String[] split = equation.split(DELIMITER); + + for (int i = 0; i < split.length; ) { + checkDoubleNumber(split, i); + i += 2; + } + + for (int i = 1; i < split.length; ) { + checkDoubleSymbol(split, i); + i += 2; + } + + } + + public List getNumbers() { + List numList = new ArrayList<>(); + String[] inputArr = equation.split(DELIMITER); + Arrays.stream(inputArr).filter(this::isParesInt).forEach(s -> addNumList(numList, s)); + return numList; + } + + public List getSymbolsList() { + List symbolList = new ArrayList<>(); + String[] inputArr = equation.split(DELIMITER); + Arrays.stream(inputArr).filter(s -> !isParesInt(s)) + .forEach(s -> addSymbolList(symbolList, s)); + return symbolList; + } + + private boolean isParesInt(String input) { + return input.chars().allMatch(Character::isDigit); + } + + private void addNumList(List numList, String input) { + numList.add(Integer.parseInt(input)); + } + + private void addSymbolList(List symbolList, String input) { + checkSymbol(input); + symbolList.add(input); + } + + private void checkSymbol(String input) { + if (!SymbolStatus.checkSymbol(input)) { + throw new IllegalStateException(INVALID_CALCULATION_FORMAT); + } + } + + private void checkDoubleNumber(String[] split, int i) { + boolean parseInt = isParesInt(split[i]); + if (!parseInt) { + throw new IllegalStateException(INVALID_CALCULATION_FORMAT); + } + } + + private void checkDoubleSymbol(String[] split, int i) { + boolean parse = isParesInt(split[i]); + if (parse) { + throw new IllegalStateException(INVALID_CALCULATION_FORMAT); + } + } + +} diff --git a/src/test/java/study/EquationTest.java b/src/test/java/study/EquationTest.java new file mode 100644 index 0000000..d9445e6 --- /dev/null +++ b/src/test/java/study/EquationTest.java @@ -0,0 +1,41 @@ +package study; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class EquationTest { + + @ParameterizedTest + @ValueSource(strings = {"/", "+"}) + @DisplayName("연산 기호만 반환") + void returnSymbolList(String symbol) { + //given + String input = "3 / 4 + 5"; + Equation equation = new Equation(input); + + //when + List symbols = equation.getSymbolsList(); + + //then + assertThat(symbols.contains(symbol)).isTrue(); + } + + @ParameterizedTest + @ValueSource(ints = {3, 4}) + @DisplayName("숫자들만 반환") + void returnIntList(int num) { + //given + String input = "3 + 4"; + Equation equation = new Equation(input); + + //when + List ints = equation.getNumbers(); + + //then + assertThat(ints.contains(num)).isTrue(); + } +} From 4ea91cd8aea3b8ead8f4e63bf4bf5420e22339fc Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Fri, 28 Jan 2022 15:00:48 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=EB=8B=A8=EC=88=9C=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4.=20?= =?UTF-8?q?=20=20=20=20-=20[x]=20=EC=A3=BC=EC=96=B4=EC=A7=84=20=EC=82=AC?= =?UTF-8?q?=EC=B9=99=EC=97=B0=EC=82=B0=EA=B8=B0=ED=98=B8=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EB=91=90=20=EA=B0=9C=EC=9D=98=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=EB=A5=BC=20=EA=B3=84=EC=82=B0=ED=95=9C=EB=8B=A4.=20?= =?UTF-8?q?=20=20=20=20-=20=EC=82=AC=EC=B9=99=EC=97=B0=EC=82=B0=20?= =?UTF-8?q?=EA=B8=B0=ED=98=B8(symbol)=20=20=20=20=20-=20[x]=20->=EB=91=90?= =?UTF-8?q?=20=EA=B0=9C=EC=9D=98=20=EC=88=AB=EC=9E=90=EB=A5=BC=20=EB=8D=A7?= =?UTF-8?q?=EC=85=88=20=20=20=20=20-=20[x]=20~/java/TDD/java-string-calcul?= =?UTF-8?q?ator->=EB=91=90=20=EA=B0=9C=EC=9D=98=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EB=BA=84=EC=85=88=20=20=20=20=20-=20[x]=20->?= =?UTF-8?q?=EB=91=90=20=EA=B0=9C=EC=9D=98=20=EC=88=AB=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=EA=B3=B1=EC=85=88=20=20=20=20=20-=20[x]=20->=EB=91=90=20?= =?UTF-8?q?=EA=B0=9C=EC=9D=98=20=EC=88=AB=EC=9E=90=EB=A5=BC=20=EB=82=98?= =?UTF-8?q?=EB=88=97=EC=85=88=20=20=20=20=20=20=20=20=20-=20[x]=200?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=88=84=EB=A9=B4=20throw=20new?= =?UTF-8?q?=20ArithmeticException();?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/SimpleCalculator.java | 52 +++++++++++++ src/test/java/study/SimpleCalculatorTest.java | 75 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/main/java/study/SimpleCalculator.java create mode 100644 src/test/java/study/SimpleCalculatorTest.java diff --git a/src/main/java/study/SimpleCalculator.java b/src/main/java/study/SimpleCalculator.java new file mode 100644 index 0000000..da1c80b --- /dev/null +++ b/src/main/java/study/SimpleCalculator.java @@ -0,0 +1,52 @@ +package study; + +public class SimpleCalculator { + + private final Equation equation; + + private static final String NO_DIVIDE_BY_ZERO = "0으로 나눌 수 없습니다."; + + public SimpleCalculator(Equation equation) { + this.equation = equation; + } + + public int cal(String symbol, Integer num1, Integer num2) { + if (symbol.equals(SymbolStatus.PLUS.toString())) { + return num1 + num2; + } + + if (symbol.equals(SymbolStatus.MINUS.toString())) { + return num1 - num2; + } + + if (symbol.equals(SymbolStatus.MULTIPLY.toString())) { + return num1 * num2; + } + + if (symbol.equals(SymbolStatus.DIVISION.toString())) { + checkDivideByZero(num2); + return num1 / num2; + } + + throw new IllegalStateException("잘못 입력하셨습니다.."); + } + + private void checkDivideByZero(Integer num) { + if (num == 0) { + throw new ArithmeticException(NO_DIVIDE_BY_ZERO); + } + } + + public int calEquation() { + int cal = cal( + equation.getSymbolsList().get(0), + equation.getNumbers().get(0), + equation.getNumbers().get(1)); + + for (int i = 1; i < equation.getSymbolsList().size(); i++) { + cal = cal(equation.getSymbolsList().get(i), cal, equation.getNumbers().get(i + 1)); + } + + return cal; + } +} diff --git a/src/test/java/study/SimpleCalculatorTest.java b/src/test/java/study/SimpleCalculatorTest.java new file mode 100644 index 0000000..6695afb --- /dev/null +++ b/src/test/java/study/SimpleCalculatorTest.java @@ -0,0 +1,75 @@ +package study; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class SimpleCalculatorTest { + + @Test + void plusTest() { + //given + String input = "10 + 5"; + Equation equation = new Equation(input); + SimpleCalculator calculator = new SimpleCalculator(equation); + + //when + int result = calculator.cal( + equation.getSymbolsList().get(0), + equation.getNumbers().get(0), + equation.getNumbers().get(1)); + + //then + assertThat(result).isEqualTo(15); + } + + @Test + void minusTest() { + //given + String input = "10 - 5"; + Equation equation = new Equation(input); + SimpleCalculator calculator = new SimpleCalculator(equation); + + //when + int result = calculator.cal( + equation.getSymbolsList().get(0), + equation.getNumbers().get(0), + equation.getNumbers().get(1)); + + //then + assertThat(result).isEqualTo(5); + } + + @Test + void multiplyTest() { + //given + String input = "10 * 5"; + Equation equation = new Equation(input); + SimpleCalculator calculator = new SimpleCalculator(equation); + //when + int result = calculator.cal( + equation.getSymbolsList().get(0), + equation.getNumbers().get(0), + equation.getNumbers().get(1)); + + //then + assertThat(result).isEqualTo(50); + } + + @Test + void divisionTest() { + //given + String input = "10 / 5"; + Equation equation = new Equation(input); + SimpleCalculator calculator = new SimpleCalculator(equation); + //when + int result = calculator.cal( + equation.getSymbolsList().get(0), + equation.getNumbers().get(0), + equation.getNumbers().get(1)); + + //then + assertThat(result).isEqualTo(2); + } + +} From 6d933ba0d1e9c4caa193e9fc294972c895bd1c18 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Fri, 28 Jan 2022 15:02:43 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=EC=97=B0=EC=82=B0=EA=B8=B0=ED=98=B8(enum)?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/SymbolStatus.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/study/SymbolStatus.java diff --git a/src/main/java/study/SymbolStatus.java b/src/main/java/study/SymbolStatus.java new file mode 100644 index 0000000..a9a8654 --- /dev/null +++ b/src/main/java/study/SymbolStatus.java @@ -0,0 +1,21 @@ +package study; + +import java.util.Arrays; + +public enum SymbolStatus { + PLUS("+"), MINUS("-"), MULTIPLY("*"), DIVISION("/"); + + private String value; + + SymbolStatus(String value) { + this.value = value; + } + + public String toString() { + return this.value; + } + + public static boolean checkSymbol(String inputArr) { + return Arrays.stream(values()).anyMatch(value -> value.toString().equals(inputArr)); + } +} From e0fdcff71e1955615b4c6ac4e2df0aa48ff23103 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Fri, 28 Jan 2022 15:03:25 +0900 Subject: [PATCH 5/6] =?UTF-8?q?InputView/ResultView=EB=A5=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/InputView.java | 16 ++++++++++++++++ src/main/java/study/ResultView.java | 13 +++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/main/java/study/InputView.java create mode 100644 src/main/java/study/ResultView.java diff --git a/src/main/java/study/InputView.java b/src/main/java/study/InputView.java new file mode 100644 index 0000000..00cbce9 --- /dev/null +++ b/src/main/java/study/InputView.java @@ -0,0 +1,16 @@ +package study; + +import java.util.Scanner; + +public class InputView { + + private Scanner scanner; + + public InputView(Scanner scanner) { + this.scanner = scanner; + } + + public String readEquation() { + return scanner.nextLine(); + } +} diff --git a/src/main/java/study/ResultView.java b/src/main/java/study/ResultView.java new file mode 100644 index 0000000..34e38b1 --- /dev/null +++ b/src/main/java/study/ResultView.java @@ -0,0 +1,13 @@ +package study; + +public class ResultView { + + public void initStart() { + System.out.println("계산식을 입력하세요."); + } + + public void viewResult(SimpleCalculator simpleCalculator) { + int result = simpleCalculator.calEquation(); + System.out.println("계산 결과 = " + result); + } +} From a91070bf552be35f93236d484d180a8c232eb3a4 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Fri, 28 Jan 2022 15:03:47 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=9D=84=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/Main.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/study/Main.java diff --git a/src/main/java/study/Main.java b/src/main/java/study/Main.java new file mode 100644 index 0000000..8a0d3fc --- /dev/null +++ b/src/main/java/study/Main.java @@ -0,0 +1,20 @@ +package study; + +import java.util.Scanner; + +public class Main { + + public static void main(String[] args) { + ResultView resultView = new ResultView(); + + resultView.initStart(); + Scanner scanner = new Scanner(System.in); + InputView inputView = new InputView(scanner); + + Equation equation = new Equation(inputView.readEquation()); + SimpleCalculator simpleCalculator = new SimpleCalculator(equation); + + resultView.viewResult(simpleCalculator); + + } +}