From 4a974084d38dfc5a81e55bca4a2520a5498e6e70 Mon Sep 17 00:00:00 2001 From: jennykhin Date: Mon, 20 Oct 2025 22:42:46 +0900 Subject: [PATCH 1/4] feat: Update README.MD --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0247..dce58ea97d 100644 --- a/README.md +++ b/README.md @@ -1 +1,28 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 입력한 문자열에서 숫자를 추출하여 더하기를 계산하는 프로그램 + +### 기능목록 + +1. 기본 구분자(쉼표, 콜론)로 구성된 문자열의 결과 계산 + +예: + +```` +입력: 1,2,3 +```` +``` +출력: 6 +``` +--- +2. 커스텀 구분자로 구성된 문자열 계산 +예: + +``` +입력: //-\n1-2-3 +``` +``` +출력: 6 +``` +--- +3. 잘못된 입력값 처리 \ No newline at end of file From 5d2be2c94f75c70c89932b5e921bcc0ffde2fa23 Mon Sep 17 00:00:00 2001 From: jennykhin Date: Mon, 20 Oct 2025 23:07:30 +0900 Subject: [PATCH 2/4] feat: Update README.MD --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dce58ea97d..f4f02c82d6 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## 입력한 문자열에서 숫자를 추출하여 더하기를 계산하는 프로그램 -### 기능목록 +### 기능설명 1. 기본 구분자(쉼표, 콜론)로 구성된 문자열의 결과 계산 @@ -25,4 +25,15 @@ 출력: 6 ``` --- -3. 잘못된 입력값 처리 \ No newline at end of file +3. 잘못된 입력값 처리 + +### 기능목록 + +1. Application 의 main()에서 입력,출력 결과 처리 + Note: 빈 입력이면 0 반환 + +2. Regex을 이용해 구분자로 분리 후 결과 계산 + +3. 유효하지 않은 문자열 확인후 IllegalArgumentException 후 프로그램 종료 + + From eb43a59caa665b75a3006e2a9568804f38ff96ef Mon Sep 17 00:00:00 2001 From: jennykhin Date: Mon, 20 Oct 2025 23:10:44 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Application.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..03b5e71a68 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,11 @@ 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(); + int answer = Calculator.add(input); + System.out.println("결과 : " + answer); } } From 98402b9c621c218bd3834b504740a4b0a320390b Mon Sep 17 00:00:00 2001 From: jennykhin Date: Mon, 20 Oct 2025 23:53:45 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Application.java | 18 +++++-- src/main/java/calculator/Calculator.java | 62 +++++++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/main/java/calculator/Calculator.java diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 03b5e71a68..59766c6775 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,11 +1,23 @@ package calculator; + import camp.nextstep.edu.missionutils.Console; public class Application { public static void main(String[] args) { System.out.println("덧셈할 문자열을 입력해 주세요."); - String input = Console.readLine(); - int answer = Calculator.add(input); - System.out.println("결과 : " + answer); + String first = Console.readLine(); + + String input = first; + if (first != null && first.contains("\\n")) { + input = first.replace("\\n", "\n"); + } + + else if (first != null && first.startsWith("//")) { + String numbers = Console.readLine(); + input = first + "\n" + (numbers == null ? "" : numbers); + } + + int result = Calculator.add(input); + System.out.println("결과 : " + result); } } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000000..8a3f37a940 --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,62 @@ +package calculator; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Calculator { + private static final Pattern CUSTOM_PATTERN = + Pattern.compile("^//(?.+)\\n(?.*)$"); + private static final String DEFAULT_PATTERN = "[,:]"; + public static int add(String input) { + if (input == null || input.isEmpty()) { + return 0; + } + + InputType inputStr = checkInputType(input); // custom 인지 default 인지 구분해서 sep,num 인 InputType 반환 + String[] values = filter(inputStr); // 검사전 값들 + + int sum = 0; + for (String value : values) { + validate(value); // 유효성 검사 + int num = Integer.parseInt(value); + if (num < 0) { + throw new IllegalArgumentException("음수는 허용되지 않습니다: " + value); + } + sum += num; + } + return sum; + } + private static InputType checkInputType(String input) { + Matcher m = CUSTOM_PATTERN.matcher(input); + if (m.matches()) { + String rawSep = m.group("sep"); + String ignore = Pattern.quote(rawSep); + return new InputType(ignore, m.group("numbers")); + } + return new InputType(DEFAULT_PATTERN, input); + } + private static String[] filter(InputType str) { + String regex = DEFAULT_PATTERN; + if (!str.sep.equals(DEFAULT_PATTERN)) { + regex = DEFAULT_PATTERN + "|" + str.sep; + } + return str.numbers.split(regex, -1); + } + private static void validate(String value) { + if (value == null || value.isEmpty()) { + throw new IllegalArgumentException("비어 있는 숫자 토큰이 있습니다."); + } + if (!value.chars().allMatch(Character::isDigit)) { + throw new IllegalArgumentException("숫자가 아닌 값 발견: " + value); + } + } + private static final class InputType { + final String sep; + final String numbers; + InputType(String sep, String numbers) { + this.sep = sep; + this.numbers = numbers; + } + } + +}