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
15 changes: 15 additions & 0 deletions .github/workflows/auto-reviewer.yml
Original file line number Diff line number Diff line change
@@ -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
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -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`을 요청해 팀원들의 피드백을 받습니다.

76 changes: 76 additions & 0 deletions src/main/java/StringCalculator.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
9 changes: 9 additions & 0 deletions src/main/java/main.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
58 changes: 58 additions & 0 deletions src/test/java/StringCalculatorTest.java
Original file line number Diff line number Diff line change
@@ -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);
}

}
13 changes: 0 additions & 13 deletions src/test/java/study/StringTest.java

This file was deleted.