From d4a65bdb4341786c45e13e4b1786dbe74d9df1dc Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 22:18:46 +0900 Subject: [PATCH 1/8] docs(README.md): add initial README --- README.md | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b29..f6a0c3a7 100644 --- a/README.md +++ b/README.md @@ -1 +1,37 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +### ** 최종 산출물** + +- 입력한 문자열에서 숫자를 추출하여 더하는 계산기 + +### ** 구현할 기능목록** + +1. 유저가 input 값을 입력하도록 유도한다 + + - "덧셈할 문자열을 입력해 주세요." + +2. input값에 커스텀 구분자가 있는지 확인한다 + + 1. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치한다 + 2. 커스텀 구분자가 있는 경우 + + - 구분자를 추출한다 + - 구분자를 담았던 부분을 제거한다 (문자열의 "//"부터 "\n"까지) + +3. 에러처리 + + 1. 조건 + + - 사용자가 잘못된 값을 입력할 경우 + - 합의된 구분자(쉼표, 콜론, 커스텀 구분자)와 양수가 아닌 것이 포함되어있는 경우 + + 2. 처리 + + - “[ERROR]”로 시작하는 메시지와 함께 `Error`를 발생시킨다 + - `Error`를 발생시킨 후 애플리케이션을 종료한다 + +4. 문자열에서 쉼표, 콜론 또는 커스텀 구분자를 기준으로 숫자를 추출한다 + + - 빈 문자열일때에는 0을 반환한다 + +5. 각 숫자의 합을 반환한다 From f534f6d1a4574a2c6932bd56da0099189c67ad5d Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 22:28:55 +0900 Subject: [PATCH 2/8] feat(input): prompt user to enter a string for addition --- src/App.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 091aa0a5..452fd3a5 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,11 @@ +import { MissionUtils } from "@woowacourse/mission-utils"; + class App { - async run() {} + async run() { + const input = await MissionUtils.Console.readLineAsync( + "덧셈할 문자열을 입력해 주세요.\n", + ); + } } export default App; From b413b85caa2c24ef72da1fd651c4b630b90d637b Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 22:43:08 +0900 Subject: [PATCH 3/8] feat(parser): detect and extract custom delimiter from input string --- src/App.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/App.js b/src/App.js index 452fd3a5..5f43f4d5 100644 --- a/src/App.js +++ b/src/App.js @@ -5,6 +5,17 @@ class App { const input = await MissionUtils.Console.readLineAsync( "덧셈할 문자열을 입력해 주세요.\n", ); + + let customDelimiter; + let numbers = input; + + const pattern = /^\/\/(.+)\\n/; + const match = input.match(pattern); + + if (match) { + customDelimiter = match[1]; + numbers = input.replace(pattern, ""); + } } } From 02a2c3564e7aac1f77990ba430231bad11cd5850 Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 22:53:15 +0900 Subject: [PATCH 4/8] =?UTF-8?q?docs(README.md):=20add=20clarification=20?= =?UTF-8?q?=EC=A6=89,=20to=20error=20handling=20condition=20description?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f6a0c3a7..799efdf6 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ 1. 조건 - - 사용자가 잘못된 값을 입력할 경우 - 합의된 구분자(쉼표, 콜론, 커스텀 구분자)와 양수가 아닌 것이 포함되어있는 경우 2. 처리 From a84c54bf291cc1287a51bbbddfcf3f43cf5c0e97 Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 23:14:10 +0900 Subject: [PATCH 5/8] feat(error-handling): validate input and throw error --- src/App.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/App.js b/src/App.js index 5f43f4d5..93d17e34 100644 --- a/src/App.js +++ b/src/App.js @@ -7,14 +7,31 @@ class App { ); let customDelimiter; - let numbers = input; + let target = input; const pattern = /^\/\/(.+)\\n/; const match = input.match(pattern); if (match) { customDelimiter = match[1]; - numbers = input.replace(pattern, ""); + target = input.replace(pattern, ""); + } + + const allowedDelimiters = [",", ":", customDelimiter].filter(Boolean); + const allowedPattern = new RegExp(`^[0-9${allowedDelimiters.join("")}]+$`); + + if (!allowedPattern.test(target)) { + throw new Error( + "[ERROR] 합의되지 않은 구분자나 문자가 포함되어 있습니다.", + ); + } + + const splitPattern = new RegExp(`[${allowedDelimiters.join("")}]`); + const tokens = target.split(splitPattern); + for (const token of tokens) { + if (token && Number(token) <= 0) { + throw new Error("[ERROR] 0 또는 음수는 입력할 수 없습니다."); + } } } } From 7fedeaf10d9e79d060a61ef947316c20c1fc7997 Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 23:19:01 +0900 Subject: [PATCH 6/8] feat(parser): extract numbers from input string --- src/App.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/App.js b/src/App.js index 93d17e34..46bf2d7c 100644 --- a/src/App.js +++ b/src/App.js @@ -33,6 +33,8 @@ class App { throw new Error("[ERROR] 0 또는 음수는 입력할 수 없습니다."); } } + + const numbers = tokens.map(Number); } } From 46a6f6d0da0e44bac6d1a03a7c895035db344906 Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 23:23:40 +0900 Subject: [PATCH 7/8] feat(sum): return the sum of all numbers --- src/App.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/App.js b/src/App.js index 46bf2d7c..ddceccfd 100644 --- a/src/App.js +++ b/src/App.js @@ -35,6 +35,10 @@ class App { } const numbers = tokens.map(Number); + + const result = numbers.reduce((acc, cur) => acc + cur, 0); + + MissionUtils.Console.print(`결과 : ${result}`); } } From f4ba5b89f96557f1ea248cde1b0d107811ec52b1 Mon Sep 17 00:00:00 2001 From: Yunjeong Choi Date: Mon, 20 Oct 2025 23:27:31 +0900 Subject: [PATCH 8/8] docs(README.md): remove bold formatting characters --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 799efdf6..bfb0a1c2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # javascript-calculator-precourse -### ** 최종 산출물** +### 최종 산출물 - 입력한 문자열에서 숫자를 추출하여 더하는 계산기 -### ** 구현할 기능목록** +### 구현할 기능목록 1. 유저가 input 값을 입력하도록 유도한다