From 4bbab2fb04e7ed3cbdc63f255a3ccb61a4dc1fae Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 22:50:58 +0900 Subject: [PATCH 1/8] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EB=B2=88=ED=98=B8=20=EC=88=9C=EC=84=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b29..2a00e278 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse +1. 빈 문자열("")또는 null 입력 시 합계로 0을 반환한다. +2. 쉼표(,)를 구분자로 사용하여 숫자를 분리하고 덧셈을 수행한다. +3. 콜론(;)을 구분자로 사용하여 숫자를 분리하고 덧셈을 수행한다. +4. 쉼표와 콜론이 혼용된 경우에도 정상적으로 분리하여 덧셈을 수행한다. +5. 문자열 시작의 //와 \n 사이에 위치한 문자를 커스텀 구분자로 인식한다. +6. 커스텀 구분자를 사용하여 숫자를 분리하고 덧셈 결과를 반환한다. +7. 입력 문자열에 음수가 포함될 경우 [ERROR]로 시작하는 메시지와 함께 Error를 발생시킨다. +8. 입력 문자열에 숫자가 아닌 다른 값이 포함될 경우 [ERROR] 로 시작하는 메시지와 함께 Error를 발생시킨다. +9. Console.readLineAsync()를 사용해서 문자열을 입력받는다. +10. Console.print()를 사용해서 결과:[숫자]형식으로 출력한다. +11. 프로그램 실행 시작점은 App.js의 run() 함수를 따른다. \ No newline at end of file From 1e070f76a78e1aa6a82a2ff5be8f9319b0f39b06 Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:05:26 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=EB=B9=88=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=20=EB=B0=8F=20null=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C?= =?UTF-8?q?=200=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=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/App.js | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 091aa0a5..a1728413 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,28 @@ class App { - async run() {} + async run() {// 9번 기능 + const inputString = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); + + try { + const result = this.add(inputString); + + // 10번 기능 + Console.print(`결과 : ${result}`); + + } catch (error) { + // 예외 처리 (7, 8번 기능) + Console.print(error.message); + } + } + add(text) { + // 1번 기능 + if (text === null || text === undefined || text.length === 0) { + return 0; + } + + // --- 여기에 2번부터 8번까지 --- + + return 0; // (임시 반환) + } } export default App; From c7face8640a286cbcfd748d4415063d3f2cf6418 Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:17:24 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=EC=89=BC=ED=91=9C=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=EC=9E=90=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EB=8D=A7=EC=85=88=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 24 ++++++++++-------------- src/StringAddCalculator.js | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 src/StringAddCalculator.js diff --git a/src/App.js b/src/App.js index a1728413..a9ab8571 100644 --- a/src/App.js +++ b/src/App.js @@ -1,28 +1,24 @@ +import { Console } from "@woowacourse/mission-utils"; +import StringAddCalculator from "./StringAddCalculator.js"; // StringAddCalculator 가져오기 + class App { - async run() {// 9번 기능 + // 11번 기능 + async run() { + // 9번 기능 const inputString = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); try { - const result = this.add(inputString); + // 분리된 계산기 클래스의 add 함수를 호출하여 계산 + const result = StringAddCalculator.add(inputString); // 10번 기능 Console.print(`결과 : ${result}`); } catch (error) { - // 예외 처리 (7, 8번 기능) + // 7, 8번 예외 처리 발생 시 메시지 출력 Console.print(error.message); } } - add(text) { - // 1번 기능 - if (text === null || text === undefined || text.length === 0) { - return 0; - } - - // --- 여기에 2번부터 8번까지 --- - - return 0; // (임시 반환) - } } -export default App; +export default App; \ No newline at end of file diff --git a/src/StringAddCalculator.js b/src/StringAddCalculator.js new file mode 100644 index 00000000..a5232524 --- /dev/null +++ b/src/StringAddCalculator.js @@ -0,0 +1,21 @@ +class StringAddCalculator { + static add(text) { + // 1번 기능: 빈 문자열("") 또는 null 입력 시 0 반환 + if (text === null || text === undefined || text.length === 0) { + return 0; + } + + // 2번 기능 + const numbers = text.split(','); // 쉼표(,)를 기준으로 분리 + + let sum = 0; + for (const numberString of numbers) { + const number = parseInt(numberString.trim(), 10); + sum += number; + } + + return sum; + } +} + +export default StringAddCalculator; \ No newline at end of file From ceb67080ea706c0906f1f1badb6e1e79b98df657 Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:20:58 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=EC=BD=9C=EB=A1=A0=EC=9D=84=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8=ED=95=9C=20=EA=B8=B0=EB=B3=B8=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=EC=9E=90=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=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/StringAddCalculator.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/StringAddCalculator.js b/src/StringAddCalculator.js index a5232524..209af5a3 100644 --- a/src/StringAddCalculator.js +++ b/src/StringAddCalculator.js @@ -5,13 +5,18 @@ class StringAddCalculator { return 0; } - // 2번 기능 - const numbers = text.split(','); // 쉼표(,)를 기준으로 분리 + // 2번, 3번 기능 + const numbers = text.split(/[,:]/); // 쉼표(,) 또는 콜론(:)을 기준으로 구분 let sum = 0; for (const numberString of numbers) { const number = parseInt(numberString.trim(), 10); - sum += number; + // 주의: parseInt 결과가 NaN(Not a Number)인 경우는 + // 8번 기능(숫자가 아닌 값 예외 처리)에서 처리해야 한다. + // 일단은 단순 덧셈 + if (!isNaN(number)) { + sum += number; + } } return sum; From 0b5cbb3d502690cb5e304dc9f5f1e73c7ba09960 Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:30:21 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=EC=9E=90=20=EC=9D=B8=EC=8B=9D=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=B4=EB=A5=BC=20=ED=99=9C=EC=9A=A9=ED=95=9C=20=EB=8D=A7?= =?UTF-8?q?=EC=85=88=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/StringAddCalculator.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/StringAddCalculator.js b/src/StringAddCalculator.js index 209af5a3..4f6039c3 100644 --- a/src/StringAddCalculator.js +++ b/src/StringAddCalculator.js @@ -7,11 +7,22 @@ class StringAddCalculator { // 2번, 3번 기능 const numbers = text.split(/[,:]/); // 쉼표(,) 또는 콜론(:)을 기준으로 구분 - + let calculationText = text; + // 5번 기능 구현 시작 + const customMatch = calculationText.match(CUSTOM_DELIMITER_REGEX); + + if (customMatch) { + const customDelimiter = customMatch[1]; + delimiters = `[,:|${customDelimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')}]`; + calculationText = calculationText.replace(CUSTOM_DELIMITER_REGEX, ''); + } + + // 2, 3번 기능: 쉼표(,), 콜론(:), 그리고 커스텀 구분자를 포함하여 분리 + // 6번 기능까지 자연스럽게 연결됩니다. + const numbers = calculationText.split(new RegExp(delimiters)); let sum = 0; for (const numberString of numbers) { const number = parseInt(numberString.trim(), 10); - // 주의: parseInt 결과가 NaN(Not a Number)인 경우는 // 8번 기능(숫자가 아닌 값 예외 처리)에서 처리해야 한다. // 일단은 단순 덧셈 if (!isNaN(number)) { From 52b288f905dff5816616730db920f1c6538ff824 Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:35:19 +0900 Subject: [PATCH 6/8] =?UTF-8?q?fix:=20=EC=9D=8C=EC=88=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=8B=9C=20[ERROR]=EC=99=80=20=ED=95=A8=EA=BB=98?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/StringAddCalculator.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/StringAddCalculator.js b/src/StringAddCalculator.js index 4f6039c3..e9744f7e 100644 --- a/src/StringAddCalculator.js +++ b/src/StringAddCalculator.js @@ -8,7 +8,7 @@ class StringAddCalculator { // 2번, 3번 기능 const numbers = text.split(/[,:]/); // 쉼표(,) 또는 콜론(:)을 기준으로 구분 let calculationText = text; - // 5번 기능 구현 시작 + // 5번, 6번 기능 구현 시작 const customMatch = calculationText.match(CUSTOM_DELIMITER_REGEX); if (customMatch) { @@ -18,16 +18,20 @@ class StringAddCalculator { } // 2, 3번 기능: 쉼표(,), 콜론(:), 그리고 커스텀 구분자를 포함하여 분리 - // 6번 기능까지 자연스럽게 연결됩니다. const numbers = calculationText.split(new RegExp(delimiters)); let sum = 0; for (const numberString of numbers) { - const number = parseInt(numberString.trim(), 10); - // 8번 기능(숫자가 아닌 값 예외 처리)에서 처리해야 한다. - // 일단은 단순 덧셈 - if (!isNaN(number)) { - sum += number; + const trimmedString = numberString.trim(); + if (trimmedString === "") continue; + + const number = parseInt(trimmedString, 10); + // 8번 기능(숫자가 아닌 값 예외 처리)아직 미구현 + if (isNaN(number)) continue; + //7번 기능(에러) + if (number < 0) { + throw new Error("[ERROR] 음수는 입력할 수 없습니다."); } + sum += number; } return sum; From 850e332b3f1474e46e6096b92e5065eb3f0d7cbc Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:38:11 +0900 Subject: [PATCH 7/8] =?UTF-8?q?fix:=20=EC=88=AB=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EA=B0=92=EC=9D=B4=20=ED=8F=AC=ED=95=A8?= =?UTF-8?q?=EB=90=A0=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/StringAddCalculator.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/StringAddCalculator.js b/src/StringAddCalculator.js index e9744f7e..0d082e99 100644 --- a/src/StringAddCalculator.js +++ b/src/StringAddCalculator.js @@ -25,8 +25,10 @@ class StringAddCalculator { if (trimmedString === "") continue; const number = parseInt(trimmedString, 10); - // 8번 기능(숫자가 아닌 값 예외 처리)아직 미구현 - if (isNaN(number)) continue; + // 8번 기능(에러) + if (isNaN(number)) { + throw new Error("[ERROR] 숫자만 입력할 수 있습니다."); + } //7번 기능(에러) if (number < 0) { throw new Error("[ERROR] 음수는 입력할 수 없습니다."); From 4fedc3fd0aed55f178720c9a4689f7d421de8449 Mon Sep 17 00:00:00 2001 From: Yerin_Kim Date: Mon, 20 Oct 2025 23:41:02 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20Console=20API=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9E=85?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index a9ab8571..696067b3 100644 --- a/src/App.js +++ b/src/App.js @@ -1,14 +1,14 @@ import { Console } from "@woowacourse/mission-utils"; -import StringAddCalculator from "./StringAddCalculator.js"; // StringAddCalculator 가져오기 +import StringAddCalculator from "./StringAddCalculator. class App { // 11번 기능 async run() { - // 9번 기능 - const inputString = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); - try { - // 분리된 계산기 클래스의 add 함수를 호출하여 계산 + // 9번 기능 + const inputString = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); + + // 1~8번 기능을 가진 add 함수를 호출해서 계산 const result = StringAddCalculator.add(inputString); // 10번 기능