From 5b19c155d0dc7dddfeca677b018d495e52246def Mon Sep 17 00:00:00 2001 From: Hanbeeen Date: Mon, 20 Oct 2025 23:11:43 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A51=20-=20=EC=BB=A4?= =?UTF-8?q?=EC=8A=A4=ED=85=80=20=EA=B5=AC=EB=B6=84=EC=9E=90=20=ED=8C=8C?= =?UTF-8?q?=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++++++++++++++++- src/main/java/calculator/strCalculator.java | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/calculator/strCalculator.java diff --git a/README.md b/README.md index bd90ef0247..69692403c0 100644 --- a/README.md +++ b/README.md @@ -1 +1,19 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 기능 목록 정의 + +### 기능 1. 커스텀 구분자 파싱 +- 규칙: 문자열이 "//"로 시작하면, 그 다음 한 글자를 커스텀 구분자로 설정 + +### 기능 2. 숫자 토큰 분리 +- 기본 구분자 "," ":" 허용 +- 커스텀 구분자가 있으면 기본 구분자와 함께 허용 +- ":"와 커스텀 구분자를 ","로 치환 후 ","로 split + +### 기능 3. 합산 +- 분리된 각 토큰을 정수로 변환해 모두 더함 +- 빈 항목이 나오면 예외 처리 + +### 기능 4. 검증 및 예외 +- 숫자 이외의 값, 0, 음수가 포함되면 IllegalArgumentException +- 예외는 그대로 종료 \ No newline at end of file diff --git a/src/main/java/calculator/strCalculator.java b/src/main/java/calculator/strCalculator.java new file mode 100644 index 0000000000..ac25accf21 --- /dev/null +++ b/src/main/java/calculator/strCalculator.java @@ -0,0 +1,21 @@ +package calculator; + +public class strCalculator { + public static char setCustomDelimiter(String str) { + // 빈 문자열이면 종료 + if (str.isEmpty()) { + return 0; + } + // 커스텀 구분자 초기화 + char customDelimiter = 0; + + // "//" 다음 글자를 커스텀 구분자로 할당 + if (str.startsWith("//")) { + if (str.length() < 4) { + throw new IllegalArgumentException(); + } + customDelimiter = str.charAt(2); + } + return customDelimiter; + } +} From c1376b2035e173b246e1504cdaf280807c5be1ff Mon Sep 17 00:00:00 2001 From: Hanbeeen Date: Mon, 20 Oct 2025 23:24:49 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A52=20-=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=ED=86=A0=ED=81=B0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/strCalculator.java | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/calculator/strCalculator.java b/src/main/java/calculator/strCalculator.java index ac25accf21..faaa89ab96 100644 --- a/src/main/java/calculator/strCalculator.java +++ b/src/main/java/calculator/strCalculator.java @@ -1,6 +1,7 @@ package calculator; public class strCalculator { + // 기능1 - 커스텀 구분자 파싱 public static char setCustomDelimiter(String str) { // 빈 문자열이면 종료 if (str.isEmpty()) { @@ -18,4 +19,30 @@ public static char setCustomDelimiter(String str) { } return customDelimiter; } + + // 기능2 - 숫자 토큰 분리 + public static String intergrateDelimiters(String bodyStr, char customDelimiter) { + // 빈 문자열이면 종료 + if (bodyStr.isEmpty()) { + return bodyStr; + } + // 기본 구분자 ";"을 ","로 치환 + String integrated = bodyStr.replace(":", ","); + // 커스텀 구분자가 있으면 ","로 치환 + if (customDelimiter != 0) { + integrated = integrated.replace(String.valueOf(customDelimiter), ","); + } + return integrated; + } + + // ","으로 분리 + public static String[] splitNumbers(String bodyStr, char customDelimiter) { + // 구분자 통합 + String integrated = intergrateDelimiters(bodyStr, customDelimiter); + // 빈 문자열이면 빈 배열 리턴 + if (integrated.isEmpty()) { + return new String[0]; + } + return integrated.split(",", -1); + } } From 8d4339e8a8463612888c6e14c45543ba9db2563a Mon Sep 17 00:00:00 2001 From: Hanbeeen Date: Mon, 20 Oct 2025 23:29:12 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A53=20-=20=ED=95=A9?= =?UTF-8?q?=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/strCalculator.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/calculator/strCalculator.java b/src/main/java/calculator/strCalculator.java index faaa89ab96..fb33e45c39 100644 --- a/src/main/java/calculator/strCalculator.java +++ b/src/main/java/calculator/strCalculator.java @@ -45,4 +45,24 @@ public static String[] splitNumbers(String bodyStr, char customDelimiter) { } return integrated.split(",", -1); } + + // 기능3 - 합산 + public static int sumNumbers(String[] tokens) { + // 빈 배열이면 0 + if (tokens.length == 0) { + return 0; + } + int total = 0; + for (int i = 0; i < tokens.length; i++) { + String token = tokens[i]; + // 빈 항목이면 예외 처리 + if (token.isEmpty()) { + throw new IllegalArgumentException(); + } + // 숫자 변환 + int num = Integer.parseInt(token); + total += num; + } + return total; + } } From e0e3cff105fed787b7db92cadaade49a21e61a41 Mon Sep 17 00:00:00 2001 From: Hanbeeen Date: Mon, 20 Oct 2025 23:34:49 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A54=20-=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=B0=8F=20=EC=98=88=EC=99=B8=20(=EA=B8=B0?= =?UTF-8?q?=EB=8A=A51,=202,=203=EC=97=90=EC=84=9C=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/strCalculator.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/calculator/strCalculator.java b/src/main/java/calculator/strCalculator.java index fb33e45c39..9b631823e0 100644 --- a/src/main/java/calculator/strCalculator.java +++ b/src/main/java/calculator/strCalculator.java @@ -21,7 +21,7 @@ public static char setCustomDelimiter(String str) { } // 기능2 - 숫자 토큰 분리 - public static String intergrateDelimiters(String bodyStr, char customDelimiter) { + public static String integrateDelimiters(String bodyStr, char customDelimiter) { // 빈 문자열이면 종료 if (bodyStr.isEmpty()) { return bodyStr; @@ -38,7 +38,7 @@ public static String intergrateDelimiters(String bodyStr, char customDelimiter) // ","으로 분리 public static String[] splitNumbers(String bodyStr, char customDelimiter) { // 구분자 통합 - String integrated = intergrateDelimiters(bodyStr, customDelimiter); + String integrated = integrateDelimiters(bodyStr, customDelimiter); // 빈 문자열이면 빈 배열 리턴 if (integrated.isEmpty()) { return new String[0]; @@ -59,8 +59,19 @@ public static int sumNumbers(String[] tokens) { if (token.isEmpty()) { throw new IllegalArgumentException(); } - // 숫자 변환 + // 숫자 형식 검증 -> 숫자만 허용 + for (int j = 0; j < token.length(); j++) { + if (!Character.isDigit(token.charAt(j))) { + throw new IllegalArgumentException(); + } + } + // 정수형으로 변환 int num = Integer.parseInt(token); + + // 0 또는 음수면 예외 처리 + if (num <= 0) { + throw new IllegalArgumentException(); + } total += num; } return total; From 5ffb497128d16404e13539d6b5903470f149c129 Mon Sep 17 00:00:00 2001 From: Hanbeeen Date: Mon, 20 Oct 2025 23:46:19 +0900 Subject: [PATCH 5/5] =?UTF-8?q?main=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(=EA=B0=9C=ED=96=89=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=ED=8F=AC=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Application.java | 35 +++++++++++++++++++ ...{strCalculator.java => StrCalculator.java} | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) rename src/main/java/calculator/{strCalculator.java => StrCalculator.java} (98%) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..b657cb3a94 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,42 @@ 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(); + + // 개행 문자 처리 + input = input.replace("\\n", "\n"); + + // 빈 문자열이면 0 출력 + if (input.isEmpty()) { + System.out.println("결과 : 0"); + return; + } + + // 커스텀 구분자 파싱 + char customDelimiter = StrCalculator.setCustomDelimiter(input); + + // 본문 추출 + String body = input; + if (input.startsWith("//")) { + int nl = input.indexOf('\n'); + if (nl < 0) { + throw new IllegalArgumentException(); + } + body = input.substring(nl + 1); + } + + // 숫자 토큰 분리 + String[] tokens = StrCalculator.splitNumbers(body, customDelimiter); + + // 합산 & 검증 + int total = StrCalculator.sumNumbers(tokens); + + // 결과 출력 + System.out.println("결과 : " + total); } } diff --git a/src/main/java/calculator/strCalculator.java b/src/main/java/calculator/StrCalculator.java similarity index 98% rename from src/main/java/calculator/strCalculator.java rename to src/main/java/calculator/StrCalculator.java index 9b631823e0..c5d519868c 100644 --- a/src/main/java/calculator/strCalculator.java +++ b/src/main/java/calculator/StrCalculator.java @@ -1,6 +1,6 @@ package calculator; -public class strCalculator { +public class StrCalculator { // 기능1 - 커스텀 구분자 파싱 public static char setCustomDelimiter(String str) { // 빈 문자열이면 종료