diff --git a/.github/workflows/auto-reviewer.yml b/.github/workflows/auto-reviewer.yml new file mode 100644 index 0000000..5990c70 --- /dev/null +++ b/.github/workflows/auto-reviewer.yml @@ -0,0 +1,15 @@ +name: Review Assign + +on: + pull_request: + types: [opened, ready_for_review] + +jobs: + assign: + runs-on: ubuntu-latest + steps: + - uses: hkusu/review-assign-action@v1 + with: + assignees: ${{ github.actor }} + reviewers: ${{ vars.REVIEWERS }} + max-num-of-reviewers: 1 diff --git a/README.md b/README.md index 05a04f9..bdd03e9 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ ## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) --- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push. 개인 레포지토리, 개인 브랜치에서 진행. +1. 피드백 강의 전까지 미션 진행 +- 피드백 강의 전까지 혼자 힘으로 미션 진행, 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit + - `main` 미션 레포지토리를 본인의 로컬 저장소로 `clone` 하여 프로젝트 환경을 구성합니다. + - 예를 들어 다음 숫자 야구 게임의 경우 각 미션 별 `branch`를 `pull` 받은 후 미션을 해결 한 뒤 `PR`을 보냅니다. + - 코드 수정이 더 이상 일어나지 않을 경우 리뷰어를 설정하고 다음 미션을 진행 합니다. ![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) --- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. +2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습합니다. --- -3. (임시로 만들어본 규칙입니다) 자신의 브랜치에 구현해둔 코드를 피드백을 참고해 수정해본다. -해당 코드를 본 레포지토리의 main으로 합병하는 PR을 요청해 팀원들의 피드백을 받는다. +3. 자신의 브랜치에 구현해둔 코드를 피드백을 참고해 수정해봅니다. +- 해당 코드를 본 레포지토리의 `main`으로 합병하는 `PR`을 요청해 팀원들의 피드백을 받습니다. diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java new file mode 100644 index 0000000..06883c2 --- /dev/null +++ b/src/main/java/StringCalculator.java @@ -0,0 +1,76 @@ +import java.util.NoSuchElementException; +import java.util.Scanner; + +// 사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해야 한다. +//문자열 계산기는 사칙연산의 계산 우선순위가 아닌 입력 값에 따라 계산 순서가 결정 +public class StringCalculator { + + public int execute() { + Scanner scanner = new Scanner(System.in); + System.out.print("숫자를 입력하세요: "); + String input; + try { + input = scanner.nextLine(); + }catch (NoSuchElementException e){ + throw new NoSuchElementException("공백은 입력할 수 없습니다."); + } + scanner.close(); + String[] splitInput = input.split(" "); + + return throwMethod(splitInput); + } + + public int throwMethod(String[] splitInput){ + try { + return parseInput(splitInput); + } catch (ArrayIndexOutOfBoundsException e) { + throw new ArrayIndexOutOfBoundsException("입력이 잘못되었습니다."); + } catch (NumberFormatException e) { + throw new NumberFormatException("숫자 자리에 다른 문자를 입력했거나 띄워쓰기가 잘못되었습니다."); + } + } + + public int parseInput(String[] values) { + int result = Integer.parseInt(values[0]); + for (int i = 1; i < values.length; i += 2) { + result = calculate(result, values[i], Integer.parseInt(values[i + 1])); + } + return result; + } + + public int calculate(int first, String operator, int second) { + switch (operator) { + case "+": + return add(first, second); + case "-": + return subtract(first, second); + case "*": + return multiply(first, second); + case "/": + return divide(first, second); + } + throw new IllegalArgumentException("연산자 자리에 확인되지 않은 문자가 들어왔습니다. 연산자 : " + operator); + } + + int add(int first, int second) { + return first + second; + } + + int subtract(int first, int second) { + return first - second; + } + + int multiply(int first, int second) { + return first * second; + } + + int divide(int first, int second) { + try { + return first / second; + } catch (ArithmeticException e) { + System.out.println("0으로 나누는 것은 불가능 합니다"); + } + return 0; + } + +} diff --git a/src/main/java/main.java b/src/main/java/main.java new file mode 100644 index 0000000..99876f8 --- /dev/null +++ b/src/main/java/main.java @@ -0,0 +1,9 @@ + + +public class main { + public static void main(String[] args) { + StringCalculator sc = new StringCalculator(); + int result = sc.execute(); + System.out.println("계산 결과입니다: " + result); + } +} diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java new file mode 100644 index 0000000..edc4b3e --- /dev/null +++ b/src/test/java/StringCalculatorTest.java @@ -0,0 +1,58 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class StringCalculatorTest { + + StringCalculator calculator = new StringCalculator(); + + public static void inputHandling(String userInput) { + InputStream in = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(in); + } + + @Test + void add() { + inputHandling("2 + 3 + 4 + 5"); + assertThat(calculator.execute()).isEqualTo(14); + } + + @Test + void subtract() { + inputHandling("10 - 2 - 3 - 6"); + assertThat(calculator.execute()).isEqualTo(-1); + } + + @Test + void multiply() { + inputHandling("2 * 3 * 4 * 5"); + assertThat(calculator.execute()).isEqualTo(120); + } + + @Test + void divide() { + inputHandling("20 / 2 / 5"); + assertThat(calculator.execute()).isEqualTo(2); + } + + @Test + @DisplayName("[예외] 문자열 추가") + void stringInputExceptionTest() { + inputHandling("1 C 3 * 4 / 2"); + assertThatThrownBy(() -> calculator.execute()).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("연산자"); + } + + @Test + @DisplayName("[예외] 공백 입력") + void blanckInputExceptionTest() { + inputHandling(""); + assertThat(calculator.execute()).isEqualTo(0); + } + +} \ No newline at end of file diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d9..0000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -}