From b7bbb472b543cf61c75ce59c446b20f9b54135dd Mon Sep 17 00:00:00 2001 From: hyun0618 <163616398+hyun0618@users.noreply.github.com> Date: Wed, 15 Oct 2025 02:07:02 +0900 Subject: [PATCH 1/4] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0247..f139f987a5 100644 --- a/README.md +++ b/README.md @@ -1 +1,7 @@ -# java-calculator-precourse \ No newline at end of file +## 구현할 기능 목록 +- [ ] 빈 문자열 또는 null 입력이면 0 반환 +- [ ] 쉼표(,), 콜론(:)을 구분자로 가지는 문자열은 분리하여 합산 +- [ ] 커스텀 구분자 지정 가능("//<구분자>\n" 형식, 한 글자) +- [ ] 잘못된 입력(숫자 이외, 음수·0, 공백 등 비정상 형식) 시 IllegalArgumentException 발생 +- [ ] 입출력: Console.readLine()으로 입력 받고 "결과 : <합>" 출력 +- [ ] 예외 발생 시 프로그램 종료 (System.exit() 사용 금지) From 146e99958a89a3b5410fae929cbd854a05eda5a3 Mon Sep 17 00:00:00 2001 From: hyun0618 <163616398+hyun0618@users.noreply.github.com> Date: Wed, 15 Oct 2025 02:08:01 +0900 Subject: [PATCH 2/4] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f139f987a5..2ea87d24c0 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,4 @@ - [ ] 커스텀 구분자 지정 가능("//<구분자>\n" 형식, 한 글자) - [ ] 잘못된 입력(숫자 이외, 음수·0, 공백 등 비정상 형식) 시 IllegalArgumentException 발생 - [ ] 입출력: Console.readLine()으로 입력 받고 "결과 : <합>" 출력 -- [ ] 예외 발생 시 프로그램 종료 (System.exit() 사용 금지) +- [ ] IllegalArgumentException 발생 후 애플리케이션 종료 From d419f7a20d7f5aa09ee5a1b49193073726d923d8 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Wed, 15 Oct 2025 03:11:33 +0900 Subject: [PATCH 3/4] feat(io): print input guide and read input using Console.readLine --- src/main/java/calculator/Application.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..62f6293881 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,13 @@ 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(); + } } From cb0c033588b17dc048e1650501835d8e3ab5dc94 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 20 Oct 2025 23:33:41 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat(calculator):=20=EB=B9=88=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=C2=B7=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EB=B6=84=EC=9E=90?= =?UTF-8?q?=C2=B7=EC=BB=A4=EC=8A=A4=ED=85=80=20=EA=B5=AC=EB=B6=84=EC=9E=90?= =?UTF-8?q?=C2=B7=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=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 | 3 +- .../java/calculator/StringAddCalculator.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/calculator/StringAddCalculator.java diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 62f6293881..bed1ee292e 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -6,8 +6,9 @@ public class Application { public static void main(String[] args) { System.out.println("덧셈할 문자열을 입력해 주세요."); - String input = Console.readLine(); + int result = StringAddCalculator.add(input); + System.out.println("결과 : " + result); } } diff --git a/src/main/java/calculator/StringAddCalculator.java b/src/main/java/calculator/StringAddCalculator.java new file mode 100644 index 0000000000..172dd6a291 --- /dev/null +++ b/src/main/java/calculator/StringAddCalculator.java @@ -0,0 +1,48 @@ +package calculator; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StringAddCalculator { + private static final String DEFAULT_DELIMS = "[,:]"; + private static final Pattern CUSTOM = Pattern.compile("^//(.)\\n(.*)$"); // //;\n1;2;3 + + private StringAddCalculator() {} + + public static int add(String input) { + if (input == null || input.isBlank()) return 0; + + input = input.replace("\\n", "\n"); + + String[] tokens = tokenize(input); + validate(tokens); + + long sum = 0; + for (String t : tokens) { + int n = Integer.parseInt(t); + sum += n; + if (sum > Integer.MAX_VALUE) throw new IllegalArgumentException("[ERROR] int overflow"); + } + return (int) sum; + } + + private static String[] tokenize(String input) { + Matcher m = CUSTOM.matcher(input); + if (m.matches()) { + String delim = Pattern.quote(m.group(1)); // 1글자 커스텀 구분자 + String body = m.group(2); + if (body.isEmpty()) throw new IllegalArgumentException("[ERROR] 잘못된 입력 형식"); + return body.split(delim); + } + return input.split(DEFAULT_DELIMS); + } + + private static void validate(String[] tokens) { + for (String s : tokens) { + if (s == null || s.isBlank()) throw new IllegalArgumentException("[ERROR] 빈 토큰"); + if (!s.matches("\\d+")) throw new IllegalArgumentException("[ERROR] 숫자만 허용"); + int n = Integer.parseInt(s); + if (n <= 0) throw new IllegalArgumentException("[ERROR] 0/음수 불가"); + } + } +}