From 1a0ca9d408cebe119af142906c078a1745f218ab Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:50:41 +0900 Subject: [PATCH 1/8] docs: add feature list to README --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0247..67649ff59b 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 기능 목록 + +- [ ] 빈 문자열 입력 시 0을 반환한다. +- [ ] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. +- [ ] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. +- [ ] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. +- [ ] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. +- [ ] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. +- [ ] 사용자로부터 문자열을 입력받는다. +- [ ] 계산 결과를 "결과 : {result}" 형식으로 출력한다. \ No newline at end of file From 10e76695f35f679de79c7a2026767bd5897b4c15 Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:51:10 +0900 Subject: [PATCH 2/8] feat: return 0 for empty string input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 빈 문자열 입력 시 0을 반환하는 기능 구현 - StringCalculator 클래스 생성 - calculate 메서드에서 빈 문자열 또는 null 체크 후 0 반환 - 빈 문자열 입력 테스트 작성 및 통과 --- README.md | 2 +- src/main/java/calculator/StringCalculator.java | 11 +++++++++++ .../java/calculator/StringCalculatorTest.java | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/calculator/StringCalculator.java create mode 100644 src/test/java/calculator/StringCalculatorTest.java diff --git a/README.md b/README.md index 67649ff59b..cb39efbb34 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## 기능 목록 -- [ ] 빈 문자열 입력 시 0을 반환한다. +- [x] 빈 문자열 입력 시 0을 반환한다. - [ ] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. - [ ] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. - [ ] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java new file mode 100644 index 0000000000..de880494fb --- /dev/null +++ b/src/main/java/calculator/StringCalculator.java @@ -0,0 +1,11 @@ +package calculator; + +public class StringCalculator { + + public int calculate(String input) { + if (input == null || input.isEmpty()) { + return 0; + } + return 0; + } +} diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java new file mode 100644 index 0000000000..140f7faa51 --- /dev/null +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -0,0 +1,15 @@ +package calculator; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class StringCalculatorTest { + + @Test + void 빈_문자열_입력시_0_반환() { + StringCalculator calculator = new StringCalculator(); + int result = calculator.calculate(""); + assertThat(result).isEqualTo(0); + } +} From 230296aa258415d0859a1f89cf3dcc7845470f8f Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:52:13 +0900 Subject: [PATCH 3/8] feat: return number for single digit input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숫자 하나 입력 시 해당 숫자를 반환하는 기능 구현 - calculate 메서드에서 Integer.parseInt로 문자열을 정수로 변환 - 단일 숫자 입력 테스트 작성 및 통과 --- README.md | 2 +- src/main/java/calculator/StringCalculator.java | 2 +- src/test/java/calculator/StringCalculatorTest.java | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cb39efbb34..ba29e0c97c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## 기능 목록 - [x] 빈 문자열 입력 시 0을 반환한다. -- [ ] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. +- [x] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. - [ ] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. - [ ] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. - [ ] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java index de880494fb..1e9bff5214 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -6,6 +6,6 @@ public int calculate(String input) { if (input == null || input.isEmpty()) { return 0; } - return 0; + return Integer.parseInt(input); } } diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java index 140f7faa51..b04cd173d4 100644 --- a/src/test/java/calculator/StringCalculatorTest.java +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -12,4 +12,11 @@ class StringCalculatorTest { 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); + } } From bb3f641f1003a1b700eef6c0e3073cce0b2c0621 Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:52:57 +0900 Subject: [PATCH 4/8] feat: add sum calculation for comma-separated numbers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 쉼표 구분자로 두 숫자 입력 시 합을 반환하는 기능 구현 - split 메서드로 쉼표 기준 문자열 분리 - sum 메서드 추가하여 배열의 모든 숫자 합산 - 쉼표 구분자 입력 테스트 작성 및 통과 --- README.md | 2 +- src/main/java/calculator/StringCalculator.java | 12 +++++++++++- src/test/java/calculator/StringCalculatorTest.java | 6 ++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba29e0c97c..4bf9346e11 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - [x] 빈 문자열 입력 시 0을 반환한다. - [x] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. -- [ ] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. +- [x] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. - [ ] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. - [ ] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. - [ ] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java index 1e9bff5214..6586b55cb8 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -6,6 +6,16 @@ public int calculate(String input) { if (input == null || input.isEmpty()) { return 0; } - return Integer.parseInt(input); + + String[] numbers = input.split(","); + return sum(numbers); + } + + private int sum(String[] numbers) { + int total = 0; + for (String number : numbers) { + total += Integer.parseInt(number); + } + return total; } } diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java index b04cd173d4..c2745fdced 100644 --- a/src/test/java/calculator/StringCalculatorTest.java +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -19,4 +19,10 @@ class StringCalculatorTest { 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); + } } From 8ca5f63abdca663ec4b4e03cf78c8a36a7fc80ae Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:53:40 +0900 Subject: [PATCH 5/8] feat: support both comma and colon delimiters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 쉼표 또는 콜론 구분자로 여러 숫자 입력 시 합을 반환하는 기능 구현 - split 메서드에 정규표현식 [,:]을 사용하여 쉼표와 콜론 동시 지원 - 여러 숫자를 쉼표, 콜론, 혼합 구분자로 입력하는 테스트 작성 및 통과 --- README.md | 2 +- src/main/java/calculator/StringCalculator.java | 2 +- src/test/java/calculator/StringCalculatorTest.java | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4bf9346e11..5e8b4319ca 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - [x] 빈 문자열 입력 시 0을 반환한다. - [x] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. - [x] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. -- [ ] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. +- [x] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. - [ ] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. - [ ] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. - [ ] 사용자로부터 문자열을 입력받는다. diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java index 6586b55cb8..7d0db5d13e 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -7,7 +7,7 @@ public int calculate(String input) { return 0; } - String[] numbers = input.split(","); + String[] numbers = input.split("[,:]"); return sum(numbers); } diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java index c2745fdced..031e5e0b8c 100644 --- a/src/test/java/calculator/StringCalculatorTest.java +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -25,4 +25,12 @@ class StringCalculatorTest { 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); + } } From fbc1bdbdc83dcfc5789ce15fe40c929b9793a90e Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:54:25 +0900 Subject: [PATCH 6/8] feat: support custom delimiter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 커스텀 구분자 지정 기능 구현 - //구분자\n 형식으로 커스텀 구분자 지정 - 문자열 시작이 //인 경우 \n 까지의 문자를 커스텀 구분자로 추출 - escapeRegex 메서드로 정규표현식 특수문자 이스케이프 처리 - 커스텀 구분자 테스트 작성 및 통과 --- README.md | 2 +- src/main/java/calculator/StringCalculator.java | 16 +++++++++++++++- .../java/calculator/StringCalculatorTest.java | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e8b4319ca..cc0ff79288 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - [x] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. - [x] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. - [x] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. -- [ ] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. +- [x] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. - [ ] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. - [ ] 사용자로부터 문자열을 입력받는다. - [ ] 계산 결과를 "결과 : {result}" 형식으로 출력한다. \ No newline at end of file diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java index 7d0db5d13e..96a6c9aef4 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -7,10 +7,24 @@ public int calculate(String input) { return 0; } - String[] numbers = input.split("[,:]"); + String delimiter = "[,:]"; + String numbersString = input; + + if (input.startsWith("//")) { + int delimiterEndIndex = input.indexOf("\n"); + 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) { diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java index 031e5e0b8c..256a1f7161 100644 --- a/src/test/java/calculator/StringCalculatorTest.java +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -33,4 +33,11 @@ class StringCalculatorTest { 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); + } } From fd47592038f76900e7d36b224104c2d152653d07 Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:55:22 +0900 Subject: [PATCH 7/8] feat: validate negative number input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 음수 입력 시 예외 발생 기능 구현 - sum 메서드에서 숫자가 음수인 경우 IllegalArgumentException 발생 - 음수 입력 테스트 작성 및 통과 --- README.md | 2 +- src/main/java/calculator/StringCalculator.java | 6 +++++- src/test/java/calculator/StringCalculatorTest.java | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cc0ff79288..a7996b1f2e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,6 @@ - [x] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다. - [x] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. - [x] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. -- [ ] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. +- [x] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. - [ ] 사용자로부터 문자열을 입력받는다. - [ ] 계산 결과를 "결과 : {result}" 형식으로 출력한다. \ No newline at end of file diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java index 96a6c9aef4..b26607ee53 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -28,7 +28,11 @@ private String escapeRegex(String delimiter) { private int sum(String[] numbers) { int total = 0; for (String number : numbers) { - total += Integer.parseInt(number); + 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 index 256a1f7161..39863a85d1 100644 --- a/src/test/java/calculator/StringCalculatorTest.java +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class StringCalculatorTest { @@ -40,4 +41,11 @@ class StringCalculatorTest { assertThat(calculator.calculate("//;\n1;2;3")).isEqualTo(6); assertThat(calculator.calculate("//|\n1|2|3")).isEqualTo(6); } + + @Test + void 음수_입력시_예외_발생() { + StringCalculator calculator = new StringCalculator(); + assertThatThrownBy(() -> calculator.calculate("-1,2,3")) + .isInstanceOf(IllegalArgumentException.class); + } } From 127157429d0d0a48a487e74e322e8cfd0c0e7190 Mon Sep 17 00:00:00 2001 From: leestana01 Date: Mon, 20 Oct 2025 23:56:51 +0900 Subject: [PATCH 8/8] feat: add user input and output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 입력 및 결과 출력 기능 구현 - Console.readLine()으로 사용자 입력 받기 - 계산 결과를 "결과 : {result}" 형식으로 출력 - 리터럴 백슬래시n(\n) 처리 로직 추가 --- README.md | 4 ++-- src/main/java/calculator/Application.java | 10 +++++++++- src/main/java/calculator/StringCalculator.java | 15 ++++++++++++--- .../java/calculator/StringCalculatorTest.java | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a7996b1f2e..70d2f46ba8 100644 --- a/README.md +++ b/README.md @@ -8,5 +8,5 @@ - [x] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다. - [x] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다. - [x] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다. -- [ ] 사용자로부터 문자열을 입력받는다. -- [ ] 계산 결과를 "결과 : {result}" 형식으로 출력한다. \ No newline at end of file +- [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 index b26607ee53..8450bc67e2 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -12,9 +12,18 @@ public int calculate(String input) { if (input.startsWith("//")) { int delimiterEndIndex = input.indexOf("\n"); - String customDelimiter = input.substring(2, delimiterEndIndex); - delimiter = escapeRegex(customDelimiter); - numbersString = input.substring(delimiterEndIndex + 1); + 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); diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java index 39863a85d1..c88fa1ee56 100644 --- a/src/test/java/calculator/StringCalculatorTest.java +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -40,6 +40,7 @@ class StringCalculatorTest { 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