From a60a19204d8ab57787e0ccebbc901912ac3bf529 Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 17:37:08 +0900 Subject: [PATCH 1/7] =?UTF-8?q?docs:=20README=EC=97=90=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b29f..63b1c6afc 100644 --- a/README.md +++ b/README.md @@ -1 +1,42 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +## 문자열 덧셈 계산기 + +### 구현할 기능 목록 + +1. 빈 문자열을 입력할 경우 0을 반환하는 기능 + + - 입력: `""` + - 출력: `0` + +2. 쉼표(,)를 구분자로 가지는 문자열에서 숫자의 합을 반환하는 기능 + + - 입력: `"1,2"` + - 출력: `3` + +3. 콜론(:)을 구분자로 가지는 문자열에서 숫자의 합을 반환하는 기능 + + - 입력: `"1:2"` + - 출력: `3` + +4. 쉼표(,)와 콜론(:)을 함께 사용하여 문자열에서 숫자의 합을 반환하는 기능 + + - 입력: `"1,2:3"` + - 출력: `6` + +5. 커스텀 구분자를 지정하여 문자열에서 숫자의 합을 반환하는 기능 + + - 커스텀 구분자: `"//;\n"` + - 입력: `"//;\n1;2;3"` + - 출력: `6` + +6. 잘못된 값이 입력될 경우 에러 메시지를 출력하고 프로그램을 종료하는 기능 + - 음수가 입력된 경우: + - 입력: `"-1,2,3"` + - 출력: `[ERROR] 음수는 허용되지 않습니다.` + - 숫자가 아닌 값이 입력된 경우: + - 입력: `"1,a,3"` + - 출력: `[ERROR] 잘못된 값이 입력되었습니다.` +7. 구분자를 포함하지 않고 입력된 숫자의 합을 반환하는 기능 + - 입력: `"1"` + - 출력: `1` From b796a5988f6ffa54fed187fc45c5ab1c503a5bb2 Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 17:52:00 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat(calculator):=20=EB=B9=88=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C=200?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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 | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 091aa0a5d..0eeaf4b59 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,22 @@ +import { MissionUtils } from "@woowacourse/mission-utils"; + class App { - async run() {} + async run() { + try { + const input = await MissionUtils.Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); + const result = this.calculate(input); + MissionUtils.Console.print(`결과 : ${result}`); + } catch (error) { + MissionUtils.Console.print(`[ERROR] ${error.message}`); + throw error; + } + } + + calculate(input) { + if (!input) { + return 0; + } + } } export default App; From ba683eecfdab647b5f1819cc517e6f26956c6591 Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 18:11:31 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat(calculator):=20=EC=89=BC=ED=91=9C?= =?UTF-8?q?=EC=99=80=20=EC=BD=9C=EB=A1=A0=EC=9D=84=20=EA=B5=AC=EB=B6=84?= =?UTF-8?q?=EC=9E=90=EB=A1=9C=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=9D=98=20=ED=95=A9=EC=9D=84=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=98=EB=8A=94=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 쉼표(,)와 콜론(:)을 구분자로 사용하여 문자열을 분리하고, 각 숫자의 합을 반환하는 기능을 구현했습니다. 입력 예시: '1,2:3' -> 결과: 6 --- src/App.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/App.js b/src/App.js index 0eeaf4b59..ec2fc6151 100644 --- a/src/App.js +++ b/src/App.js @@ -16,6 +16,9 @@ class App { if (!input) { return 0; } + const numbers = input.split(/[,|:]/).map(Number); + + return numbers.reduce((acc, curr) => acc + curr, 0); } } From 17a9941f90e2505daae7b1b4f01170b195f26ffa Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 19:22:02 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat(calculator):=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20=EA=B5=AC=EB=B6=84=EC=9E=90=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=88=AB=EC=9E=90=EC=9D=98=20=ED=95=A9?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 커스텀 구분자(예: //;\n)를 지원하여 사용자 지정 구분자로 문자열을 분리하고 숫자의 합을 계산하는 기능을 추가했습니다. 입력 예시: '//;\n1;2;3' -> 결과: 6 --- src/App.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index ec2fc6151..85042d6e6 100644 --- a/src/App.js +++ b/src/App.js @@ -16,7 +16,23 @@ class App { if (!input) { return 0; } - const numbers = input.split(/[,|:]/).map(Number); + + let delimiter = /[,|:]/; + let numbersString = input; + + if (input.startsWith("//")) { + const delimiterEndIndex = input.indexOf("\\n"); + + const customDelimiter = input.substring(2, delimiterEndIndex); + numbersString = input.substring(delimiterEndIndex + 2); + delimiter = customDelimiter; + } + + const numbers = numbersString.split(delimiter).map((num) => { + const parsedNumber = Number(num.trim()); + + return parsedNumber; + }); return numbers.reduce((acc, curr) => acc + curr, 0); } From 0b79bcd6dbd13d30697759bf3e36551a06afdc30 Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 20:06:49 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat(calculator):=20=EC=9D=8C=EC=88=98=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EA=B0=92=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=8B=9C=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 다음과 같은 경우 에러를 처리하는 기능을 추가했습니다: 1. 음수 입력: '-1,2,3' -> [ERROR] 2. 숫자가 아닌 값 입력: '1,a,3' -> [ERROR] 3. 잘못된 커스텀 구분자: '//;n1;2;3' -> [ERROR] 4. 빈 문자열 포함: '1,,2,,3' -> [ERROR] 기능 요구사항을 맞추기 위해 각 에러 메시지를 [ERROR]로 통일했고, 각 에러 상황을 구분해 if문을 통해 구체적으로 처리했습니다. --- src/App.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index 85042d6e6..30afb3c7e 100644 --- a/src/App.js +++ b/src/App.js @@ -23,17 +23,32 @@ class App { if (input.startsWith("//")) { const delimiterEndIndex = input.indexOf("\\n"); + if (delimiterEndIndex === -1) { + throw new Error("[ERROR]"); + } + const customDelimiter = input.substring(2, delimiterEndIndex); + numbersString = input.substring(delimiterEndIndex + 2); + delimiter = customDelimiter; } const numbers = numbersString.split(delimiter).map((num) => { - const parsedNumber = Number(num.trim()); - - return parsedNumber; + const trimmedNum = num.trim(); + + if (trimmedNum === "") { + throw new Error("[ERROR]"); + } else if (isNaN(Number(trimmedNum))) { + throw new Error("[ERROR]"); + } + return Number(trimmedNum); }); + if (numbers.some((num) => num < 0)) { + throw new Error("[ERROR]"); + } + return numbers.reduce((acc, curr) => acc + curr, 0); } } From 3753d268415583957f3ee9692ef664674a906eb0 Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 20:22:46 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat(calculator):=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EB=A7=8C=20=EC=9E=85=EB=A0=A5=ED=96=88?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20=ED=95=B4=EB=8B=B9=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숫자 하나만 입력된 경우 해당 숫자를 그대로 반환하는 기능을 추가했습니다. 입력 예시: '1' -> 결과: 1 입력 예시: '//;\n1' -> 결과: 1 해당 기능을 반영하여 README 7번도 수정했습니다. --- README.md | 2 +- src/App.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 63b1c6afc..5814224b3 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,6 @@ - 숫자가 아닌 값이 입력된 경우: - 입력: `"1,a,3"` - 출력: `[ERROR] 잘못된 값이 입력되었습니다.` -7. 구분자를 포함하지 않고 입력된 숫자의 합을 반환하는 기능 +7. 숫자 하나만 입력했을 때 해당 숫자를 그대로 반환하는 기능 - 입력: `"1"` - 출력: `1` diff --git a/src/App.js b/src/App.js index 30afb3c7e..9e325d8ac 100644 --- a/src/App.js +++ b/src/App.js @@ -34,6 +34,11 @@ class App { delimiter = customDelimiter; } + const singleNumber = Number(numbersString.trim()); + if (!isNaN(singleNumber)) { + return singleNumber; + } + const numbers = numbersString.split(delimiter).map((num) => { const trimmedNum = num.trim(); From 4f1e35fb14f72eac85f50e1452aa6877b544d616 Mon Sep 17 00:00:00 2001 From: smimdla0205 Date: Wed, 16 Oct 2024 20:26:52 +0900 Subject: [PATCH 7/7] =?UTF-8?q?docs:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20-=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EA=B0=92=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(=EC=9D=8C=EC=88=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5,=20=EC=88=AB=EC=9E=90=EA=B0=80=20=EC=95=84=EB=8B=8C?= =?UTF-8?q?=20=EA=B0=92,=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EC=BB=A4?= =?UTF-8?q?=EC=8A=A4=ED=85=80=20=EA=B5=AC=EB=B6=84=EC=9E=90,=20=EB=B9=88?= =?UTF-8?q?=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=ED=8F=AC=ED=95=A8=20=EC=8B=9C?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 5814224b3..be99528be 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,20 @@ - 출력: `6` 6. 잘못된 값이 입력될 경우 에러 메시지를 출력하고 프로그램을 종료하는 기능 + - 음수가 입력된 경우: - 입력: `"-1,2,3"` - 출력: `[ERROR] 음수는 허용되지 않습니다.` - 숫자가 아닌 값이 입력된 경우: - 입력: `"1,a,3"` - 출력: `[ERROR] 잘못된 값이 입력되었습니다.` + - 잘못된 커스텀 구분자가 입력된 경우: + - 입력: `"//;n1;2;3"` + - 출력: `[ERROR]` + - 빈 문자열이 포함된 경우: + - 입력: `"1,,2,,3"` + - 출력: `[ERROR]` + 7. 숫자 하나만 입력했을 때 해당 숫자를 그대로 반환하는 기능 - 입력: `"1"` - 출력: `1`