diff --git a/README.md b/README.md index bd90ef0247..70d2f46ba8 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 기능 목록 + +- [x] 빈 문자열 입력 시 0을 반환한다. +- [x] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. +- [x] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. +- [x] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. +- [x] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. +- [x] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. +- [x] 사용자로부터 문자열을 입력받는다. +- [x] 계산 결과를 "결과 : {result}" 형식으로 출력한다. \ No newline at end of file diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..c60678eeec 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,15 @@ package calculator; +import camp.nextstep.edu.missionutils.Console; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + System.out.println("덧셈할 문자열을 입력해 주세요."); + String input = Console.readLine(); + + StringCalculator calculator = new StringCalculator(); + int result = calculator.calculate(input); + + System.out.println("결과 : " + result); } } diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java new file mode 100644 index 0000000000..8450bc67e2 --- /dev/null +++ b/src/main/java/calculator/StringCalculator.java @@ -0,0 +1,48 @@ +package calculator; + +public class StringCalculator { + + public int calculate(String input) { + if (input == null || input.isEmpty()) { + return 0; + } + + String delimiter = "[,:]"; + String numbersString = input; + + if (input.startsWith("//")) { + int delimiterEndIndex = input.indexOf("\n"); + if (delimiterEndIndex == -1) { + delimiterEndIndex = input.indexOf("\\n"); + if (delimiterEndIndex != -1) { + String customDelimiter = input.substring(2, delimiterEndIndex); + delimiter = escapeRegex(customDelimiter); + numbersString = input.substring(delimiterEndIndex + 2); + } + } else { + String customDelimiter = input.substring(2, delimiterEndIndex); + delimiter = escapeRegex(customDelimiter); + numbersString = input.substring(delimiterEndIndex + 1); + } + } + + String[] numbers = numbersString.split(delimiter); + return sum(numbers); + } + + private String escapeRegex(String delimiter) { + return delimiter.replaceAll("[\\[\\]{}()*+?.\\\\^$|]", "\\\\$0"); + } + + private int sum(String[] numbers) { + int total = 0; + for (String number : numbers) { + int value = Integer.parseInt(number); + if (value < 0) { + throw new IllegalArgumentException(); + } + total += value; + } + return total; + } +} diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java new file mode 100644 index 0000000000..c88fa1ee56 --- /dev/null +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -0,0 +1,52 @@ +package calculator; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class StringCalculatorTest { + + @Test + void 빈_문자열_입력시_0_반환() { + StringCalculator calculator = new StringCalculator(); + int result = calculator.calculate(""); + assertThat(result).isEqualTo(0); + } + + @Test + void 숫자_하나_입력시_해당_숫자_반환() { + StringCalculator calculator = new StringCalculator(); + assertThat(calculator.calculate("1")).isEqualTo(1); + assertThat(calculator.calculate("5")).isEqualTo(5); + } + + @Test + void 쉼표_구분자로_두_숫자_입력시_합_반환() { + StringCalculator calculator = new StringCalculator(); + assertThat(calculator.calculate("1,2")).isEqualTo(3); + } + + @Test + void 쉼표_또는_콜론_구분자로_여러_숫자_입력시_합_반환() { + StringCalculator calculator = new StringCalculator(); + assertThat(calculator.calculate("1,2,3")).isEqualTo(6); + assertThat(calculator.calculate("1:2:3")).isEqualTo(6); + assertThat(calculator.calculate("1,2:3")).isEqualTo(6); + } + + @Test + void 커스텀_구분자_사용() { + StringCalculator calculator = new StringCalculator(); + assertThat(calculator.calculate("//;\n1;2;3")).isEqualTo(6); + assertThat(calculator.calculate("//|\n1|2|3")).isEqualTo(6); + assertThat(calculator.calculate("//;\n1")).isEqualTo(1); + } + + @Test + void 음수_입력시_예외_발생() { + StringCalculator calculator = new StringCalculator(); + assertThatThrownBy(() -> calculator.calculate("-1,2,3")) + .isInstanceOf(IllegalArgumentException.class); + } +}