From ea8a0deda79e1daf866f98c6262130ee801b9935 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 19:53:08 +0900 Subject: [PATCH 01/12] =?UTF-8?q?docs:=20README=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b29..81fab5dc 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ -# javascript-calculator-precourse \ No newline at end of file +# 과제 - 문자열 덧셈 계산기 + +## 기능 요구 사항 + +입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다. + +쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. +예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 +앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. +예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. +사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다. + +## 기능 목록 정리 + +1. 문자열을 입력 받는다 + +1-1. 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료한다. + +2. 문자열에서 구분자를 기준으로 숫자를 추출 한다 + +3. 추출한 숫자의 합을 구한다 + +4. 결과값을 출력한다. From b9a221883681451b1f5ea5d2f45090dbf924d390 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:17:17 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 091aa0a5..d2f38596 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,15 @@ +import * as MissionUtils from "@woowacourse/mission-utils"; + class App { - async run() {} + async getUserNumber() { + const userInput = await MissionUtils.Console.readLineAsync( + "덧셈할 문자열을 입력해 주세요. \n" + ); + } + + async run() { + await this.getUserNumber(); + } } export default App; From be9d981f86559d6c889ad77ed0d7979b4fbf8c4c Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:20:21 +0900 Subject: [PATCH 03/12] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=95=EB=A6=AC=20=EB=82=B4=EC=9A=A9=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 81fab5dc..53600876 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ 1-1. 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료한다. +1-2. 빈문자열 또는 null일 경우 0을 반환 + 2. 문자열에서 구분자를 기준으로 숫자를 추출 한다 3. 추출한 숫자의 합을 구한다 From 663518ceb91f136d73a077d0074fa360e5751680 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:21:46 +0900 Subject: [PATCH 04/12] =?UTF-8?q?feat:=20StringCalculator=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EC=88=AB=EC=9E=90=20=EC=B6=94=EC=B6=9C=20?= =?UTF-8?q?=EB=B0=8F=20=ED=95=A9=EA=B3=84=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/App.js b/src/App.js index d2f38596..c03e990f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,39 @@ import * as MissionUtils from "@woowacourse/mission-utils"; +class StringCalculator { + calculate(text) { + if (!text) { + return 0; + } + + let delimiter = /[,\:]/; // 기본 구분자 (쉼표 또는 콜론) + let numbersString = text; + + if (text.startsWith("//")) { + const match = text.match(/\/\/(.+)\n(.*)/s); + if (!match) { + throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다."); + } + delimiter = match[1]; + numbersString = match[2]; + } + + const numbers = numbersString.split(delimiter).map(Number); + + const sum = numbers.reduce((currentSum, num) => { + if (isNaN(num)) { + throw new Error("[ERROR] 유효하지 않은 숫자가 포함되어 있습니다."); + } + if (num < 0) { + throw new Error("[ERROR] 음수는 입력할 수 없습니다."); + } + return currentSum + num; + }, 0); + + return sum; + } +} + class App { async getUserNumber() { const userInput = await MissionUtils.Console.readLineAsync( From 5ea526e5293650ba5ec4453103319c969e89273e Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:23:42 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=EA=B0=92=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index c03e990f..1a27ea49 100644 --- a/src/App.js +++ b/src/App.js @@ -35,14 +35,22 @@ class StringCalculator { } class App { - async getUserNumber() { - const userInput = await MissionUtils.Console.readLineAsync( - "덧셈할 문자열을 입력해 주세요. \n" - ); + constructor() { + this.calculator = new StringCalculator(); } async run() { - await this.getUserNumber(); + try { + const userInput = await MissionUtils.Console.readLineAsync( + "덧셈할 문자열을 입력해 주세요.\n" + ); + + const result = this.calculator.calculate(userInput); + MissionUtils.Console.print(`결과 : ${result}`); + } catch (error) { + MissionUtils.Console.print(error.message); + throw error; + } } } From 437ff190bd92ddee7dfa446b6ddc69567e9f3adc Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:32:55 +0900 Subject: [PATCH 06/12] =?UTF-8?q?fix:=20=EA=B5=AC=EB=B6=84=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=20=EB=81=9D=EB=82=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=EB=82=98=20=EC=97=B0=EC=86=8D=EB=90=9C=20=EA=B5=AC=EB=B6=84?= =?UTF-8?q?=EC=9E=90=EB=93=B1=20=EC=98=88=EC=99=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index 1a27ea49..08823f14 100644 --- a/src/App.js +++ b/src/App.js @@ -6,7 +6,7 @@ class StringCalculator { return 0; } - let delimiter = /[,\:]/; // 기본 구분자 (쉼표 또는 콜론) + let delimiter = /[,\:]/; let numbersString = text; if (text.startsWith("//")) { @@ -14,11 +14,21 @@ class StringCalculator { if (!match) { throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다."); } - delimiter = match[1]; + delimiter = new RegExp(match[1].replace(/[.*+?^${}()|[\]\\]/g, "\\$&")); // 정규식 특수문자 escape numbersString = match[2]; } - const numbers = numbersString.split(delimiter).map(Number); + if (numbersString.endsWith(",") || numbersString.endsWith(":")) { + throw new Error("[ERROR] 잘못된 입력 형식입니다."); + } + + const numberTokens = numbersString.split(delimiter); + + if (numberTokens.some((token) => token === "")) { + throw new Error("[ERROR] 잘못된 입력 형식입니다. (연속된 구분자)"); + } + + const numbers = numberTokens.map(Number); const sum = numbers.reduce((currentSum, num) => { if (isNaN(num)) { @@ -33,7 +43,6 @@ class StringCalculator { return sum; } } - class App { constructor() { this.calculator = new StringCalculator(); From 8be4730c15179fdaa3cd5976c4da693860d26b64 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:40:08 +0900 Subject: [PATCH 07/12] =?UTF-8?q?fix:=20=EA=B5=AC=EB=B6=84=EC=9E=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/App.js b/src/App.js index 08823f14..c24dd76b 100644 --- a/src/App.js +++ b/src/App.js @@ -14,21 +14,24 @@ class StringCalculator { if (!match) { throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다."); } - delimiter = new RegExp(match[1].replace(/[.*+?^${}()|[\]\\]/g, "\\$&")); // 정규식 특수문자 escape - numbersString = match[2]; - } - if (numbersString.endsWith(",") || numbersString.endsWith(":")) { - throw new Error("[ERROR] 잘못된 입력 형식입니다."); + const customDelimiter = match[1]; + if (customDelimiter.length !== 1) { + throw new Error("[ERROR] 커스텀 구분자는 한 글자여야 합니다."); + } + delimiter = new RegExp( + customDelimiter.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + ); + numbersString = match[2]; } - const numberTokens = numbersString.split(delimiter); - - if (numberTokens.some((token) => token === "")) { - throw new Error("[ERROR] 잘못된 입력 형식입니다. (연속된 구분자)"); + if (numbersString.split(delimiter).some((token) => token === "")) { + throw new Error( + "[ERROR] 잘못된 입력 형식입니다. (숫자가 없거나 연속된 구분자)" + ); } - const numbers = numberTokens.map(Number); + const numbers = numbersString.split(delimiter).map(Number); const sum = numbers.reduce((currentSum, num) => { if (isNaN(num)) { @@ -43,6 +46,7 @@ class StringCalculator { return sum; } } + class App { constructor() { this.calculator = new StringCalculator(); From fed6d4dee7e6ebc7b558bd96e13e4f8ebbeab0d2 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:42:33 +0900 Subject: [PATCH 08/12] =?UTF-8?q?fix:=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=B6=94=EA=B0=80=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/App.js b/src/App.js index c24dd76b..1bd814f7 100644 --- a/src/App.js +++ b/src/App.js @@ -6,7 +6,8 @@ class StringCalculator { return 0; } - let delimiter = /[,\:]/; + const defaultDelimiters = [",", ":"]; + let allDelimiters = [...defaultDelimiters]; let numbersString = text; if (text.startsWith("//")) { @@ -16,22 +17,26 @@ class StringCalculator { } const customDelimiter = match[1]; - if (customDelimiter.length !== 1) { - throw new Error("[ERROR] 커스텀 구분자는 한 글자여야 합니다."); + if (!customDelimiter) { + throw new Error("[ERROR] 커스텀 구분자가 비어있습니다."); } - delimiter = new RegExp( - customDelimiter.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") - ); + + allDelimiters.push(customDelimiter); // 기본 구분자에 커스텀 구분자 추가 numbersString = match[2]; } - if (numbersString.split(delimiter).some((token) => token === "")) { - throw new Error( - "[ERROR] 잘못된 입력 형식입니다. (숫자가 없거나 연속된 구분자)" - ); + const escapedDelimiters = allDelimiters.map( + (d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // 정규식 특수문자 이스케이프 + ); + const delimiterRegex = new RegExp(escapedDelimiters.join("|")); + + const numberTokens = numbersString.split(delimiterRegex); + + if (numberTokens.some((token) => token === "")) { + throw new Error("[ERROR] 잘못된 입력 형식입니다. (연속된 구분자)"); } - const numbers = numbersString.split(delimiter).map(Number); + const numbers = numberTokens.map(Number); const sum = numbers.reduce((currentSum, num) => { if (isNaN(num)) { From a8a4a4e5fb77f285750644c804d52daa4149c125 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:49:01 +0900 Subject: [PATCH 09/12] =?UTF-8?q?fix:=20=EC=82=AC=EC=A0=84=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=B6=94=EA=B0=80=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/App.js b/src/App.js index 1bd814f7..503ce2bd 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,3 @@ -import * as MissionUtils from "@woowacourse/mission-utils"; - class StringCalculator { calculate(text) { if (!text) { @@ -17,18 +15,23 @@ class StringCalculator { } const customDelimiter = match[1]; - if (!customDelimiter) { - throw new Error("[ERROR] 커스텀 구분자가 비어있습니다."); + if (customDelimiter.length !== 1) { + throw new Error("[ERROR] 커스텀 구분자는 한 글자여야 합니다."); } - allDelimiters.push(customDelimiter); // 기본 구분자에 커스텀 구분자 추가 + allDelimiters.push(customDelimiter); numbersString = match[2]; } - const escapedDelimiters = allDelimiters.map( - (d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // 정규식 특수문자 이스케이프 + const escapedDelimiters = allDelimiters.map((d) => + d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") ); - const delimiterRegex = new RegExp(escapedDelimiters.join("|")); + const validationRegex = new RegExp(`^[0-9${escapedDelimiters.join("")}]+$`); + if (numbersString && !validationRegex.test(numbersString)) { + throw new Error("[ERROR] 허용되지 않은 문자가 포함되어 있습니다."); + } + + const delimiterRegex = new RegExp(`[${escapedDelimiters.join("")}]`); const numberTokens = numbersString.split(delimiterRegex); From 8af53db4888b8e2ecb9e11d5a201b8c81689a8d4 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:51:53 +0900 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20=EA=B5=AC=EB=B6=84=EC=9E=90=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EA=B0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 65 +++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/src/App.js b/src/App.js index 503ce2bd..c427cae5 100644 --- a/src/App.js +++ b/src/App.js @@ -1,12 +1,32 @@ class StringCalculator { + parseAndValidateNumber(str) { + const trimmedStr = str.trim(); + + if (trimmedStr === "") { + throw new Error("[ERROR] 구분자 사이에 숫자가 없습니다."); + } + + const num = Number(trimmedStr); + + if (isNaN(num)) { + throw new Error("[ERROR] 유효하지 않은 숫자가 포함되어 있습니다."); + } + if (num < 0) { + throw new Error("[ERROR] 음수는 입력할 수 없습니다."); + } + if (!Number.isInteger(num)) { + throw new Error("[ERROR] 정수만 입력 가능합니다."); + } + + return num; + } + calculate(text) { if (!text) { return 0; } - const defaultDelimiters = [",", ":"]; - let allDelimiters = [...defaultDelimiters]; - let numbersString = text; + let numbers; if (text.startsWith("//")) { const match = text.match(/\/\/(.+)\n(.*)/s); @@ -15,41 +35,16 @@ class StringCalculator { } const customDelimiter = match[1]; - if (customDelimiter.length !== 1) { - throw new Error("[ERROR] 커스텀 구분자는 한 글자여야 합니다."); - } - - allDelimiters.push(customDelimiter); - numbersString = match[2]; - } - - const escapedDelimiters = allDelimiters.map((d) => - d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") - ); - const validationRegex = new RegExp(`^[0-9${escapedDelimiters.join("")}]+$`); - if (numbersString && !validationRegex.test(numbersString)) { - throw new Error("[ERROR] 허용되지 않은 문자가 포함되어 있습니다."); - } + const numbersString = match[2]; - const delimiterRegex = new RegExp(`[${escapedDelimiters.join("")}]`); - - const numberTokens = numbersString.split(delimiterRegex); - - if (numberTokens.some((token) => token === "")) { - throw new Error("[ERROR] 잘못된 입력 형식입니다. (연속된 구분자)"); + numbers = numbersString + .split(customDelimiter) + .map(this.parseAndValidateNumber); + } else { + numbers = text.split(/[,\:]/).map(this.parseAndValidateNumber); } - const numbers = numberTokens.map(Number); - - const sum = numbers.reduce((currentSum, num) => { - if (isNaN(num)) { - throw new Error("[ERROR] 유효하지 않은 숫자가 포함되어 있습니다."); - } - if (num < 0) { - throw new Error("[ERROR] 음수는 입력할 수 없습니다."); - } - return currentSum + num; - }, 0); + const sum = numbers.reduce((currentSum, num) => currentSum + num, 0); return sum; } From ff8d8df8eeadbb7bc101beb3158dda4a4c96f571 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:53:26 +0900 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20import=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index c427cae5..8570596f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,3 +1,5 @@ +import { Console } from "@woowacourse/mission-utils"; + class StringCalculator { parseAndValidateNumber(str) { const trimmedStr = str.trim(); @@ -57,14 +59,14 @@ class App { async run() { try { - const userInput = await MissionUtils.Console.readLineAsync( + const userInput = await Console.readLineAsync( "덧셈할 문자열을 입력해 주세요.\n" ); const result = this.calculator.calculate(userInput); - MissionUtils.Console.print(`결과 : ${result}`); + Console.print(`결과 : ${result}`); } catch (error) { - MissionUtils.Console.print(error.message); + Console.print(error.message); throw error; } } From 5adabfc70145c28275445d9995d673daaabc5795 Mon Sep 17 00:00:00 2001 From: JunWoo Park <97427744+always97@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:56:21 +0900 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=EC=9E=85=EB=A0=A5=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=EC=96=91=EC=9D=98=20=EC=A0=95=EC=88=98=EB=A1=9C?= =?UTF-8?q?=EB=A7=8C=20=ED=97=88=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EA=B0=95?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/App.js b/src/App.js index 8570596f..4a0f7a45 100644 --- a/src/App.js +++ b/src/App.js @@ -10,28 +10,28 @@ class StringCalculator { const num = Number(trimmedStr); - if (isNaN(num)) { - throw new Error("[ERROR] 유효하지 않은 숫자가 포함되어 있습니다."); - } - if (num < 0) { - throw new Error("[ERROR] 음수는 입력할 수 없습니다."); + if (isNaN(num) || !Number.isInteger(num)) { + throw new Error( + "[ERROR] 유효하지 않은 숫자(정수 아님)가 포함되어 있습니다." + ); } - if (!Number.isInteger(num)) { - throw new Error("[ERROR] 정수만 입력 가능합니다."); + + if (num <= 0) { + throw new Error("[ERROR] 양수만 입력할 수 있습니다."); } return num; } calculate(text) { - if (!text) { + if (text === "") { return 0; } let numbers; if (text.startsWith("//")) { - const match = text.match(/\/\/(.+)\n(.*)/s); + const match = text.match(/^\/\/(.)\n(.*)/s); if (!match) { throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다."); } @@ -46,9 +46,7 @@ class StringCalculator { numbers = text.split(/[,\:]/).map(this.parseAndValidateNumber); } - const sum = numbers.reduce((currentSum, num) => currentSum + num, 0); - - return sum; + return numbers.reduce((sum, num) => sum + num, 0); } }