From c026719052135396e54d17ff97cadc8d9d8d05c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=9D=BC=EB=AA=BD=EC=9D=B4?= Date: Fri, 17 Oct 2025 12:20:20 +0900 Subject: [PATCH 1/5] docs(readme): Initial setup and README.md creation Add detailed feature requirements and usage instructions. --- README.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b29..7b37f062 100644 --- a/README.md +++ b/README.md @@ -1 +1,79 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + + + + +## 기능 요구 사항 + +1. **기본 덧셈 기능** + - 입력한 문자열에서 숫자를 추출하고, 쉼표(,)와 콜론(:)을 구분자로 분리하여 합을 계산합니다. + - 예시: + ``` + "" => 0 + "1,2" => 3 + "1,2,3" => 6 + "1,2:3" => 6 + ``` + +2. **커스텀 구분자 지원** + - 문자열 앞부분에 `//`와 `\n` 사이에 위치한 문자를 커스텀 구분자로 사용 가능합니다. + - 예시: + ``` + "//;\n1;2;3" => 6 + "//|\n4|5|6" => 15 + ``` + +3. **에러 처리** + - 사용자가 잘못된 값을 입력하면 `[ERROR]` 메시지와 함께 Error를 발생시킵니다. + - 애플리케이션은 예외 발생 시 종료되지만, `process.exit()`를 직접 호출하지 않습니다. + - 예시: + ``` + "1,a,3" => [ERROR] Invalid input + "1,,2" => [ERROR] Invalid input + ``` + +--- + +## 입출력 요구 사항 + +- **입력** + - 구분자와 양수로 구성된 문자열 +- **출력** + - 덧셈 결과 +- **실행 예시** +`덧셈할 문자열을 입력해 주세요. +1,2:3 +결과 : 6` + + +--- + +## 실행 환경 및 프로그래밍 요구 사항 + +- Node.js **22.19.0** 이상에서 실행 가능 +- 프로그램 시작점: `App.js`의 `run()` 함수 +- `package.json` 파일은 변경 불가 +- 외부 라이브러리 사용 금지 (제공된 라이브러리만 사용) +- JavaScript Style Guide 준수 +- 종료 시 `process.exit()` 호출 금지 + +--- + +## 사용 라이브러리 + +- `@woowacourse/mission-utils`의 Console API 사용 +- 사용자 입력: `Console.readLineAsync()` +- 출력: `Console.print()` + +--- + +## 구현할 기능 목록 (커밋 단위) + +1. **README.md 작성 및 초기 세팅** +2. **기본 덧셈 기능 구현** +3. **쉼표(,)와 콜론(:) 구분자 처리 기능 구현** +4. **커스텀 구분자 처리 기능 구현** +5. **잘못된 입력 처리 및 에러 메시지 구현** +6. **Console API를 활용한 입력/출력 구현** +7. **`App.js`의 `run()` 함수에서 전체 실행 흐름 구현** +8. **테스트 케이스 작성 및 검증** From 07cfad94eab63cbadb3af02e5ce7c9340e481018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=88=98=EC=97=B0?= Date: Fri, 17 Oct 2025 13:31:29 +0900 Subject: [PATCH 2/5] feat(calculator): implement custom delimiter processing --- src/App.js | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 091aa0a5..dbd7470d 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,45 @@ +import { Console } from "@woowacourse/mission-utils"; + class App { - async run() {} + async run() { + const input = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요. \n"); + + // 빈 문자열일 경우 + if(!input){ + Console.print("결과 : 0"); + return; + } + + let numbers; + + if(input.startsWith("//")) { + const customDelimiterMatch = input.match(/^\/\/(.)\n(.*)$/); + if(customDelimiterMatch){ + const delimiter = customDelimiterMatch[1]; + const numberString = customDelimiterMatch[2]; + numbers = numberString.split(delimiter); + } else { + numbers = input.split(/[,:]/) + } + } else { + numbers = input.split(/[,:]/) + } + + let sum = 0; + + for(const num of numbers){ + const number = Number(num); + + // 음수 검증 + if (number < 0) { + throw new Error("[ERROR]"); + } + + sum += number || 0; + } + + Console.print(`결과: ${sum}`) + } } export default App; From 7005ac17cbad83beb54e2dd2f30aee06f0113c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=88=98=EC=97=B0?= Date: Mon, 20 Oct 2025 22:04:07 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactore:=20=EC=97=90=EB=9F=AC=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=A7=81=20=EC=9E=85=EB=A0=A5=EA=B0=92=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=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 | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/App.js b/src/App.js index dbd7470d..b10f0245 100644 --- a/src/App.js +++ b/src/App.js @@ -1,45 +1,47 @@ import { Console } from "@woowacourse/mission-utils"; class App { - async run() { - const input = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요. \n"); + async run () { + const numberInput = await Console.readLineAsync('덧셈할 문자열을 입력해 주세요. \n'); - // 빈 문자열일 경우 - if(!input){ - Console.print("결과 : 0"); - return; - } + // 입력하지 않을 경우 결과 0 출력 + if(!numberInput || numberInput.length === 0){ + throw new Error('[ERROR] 덧셈할 문자열을 입력해 주세요.') + } let numbers; - if(input.startsWith("//")) { - const customDelimiterMatch = input.match(/^\/\/(.)\n(.*)$/); - if(customDelimiterMatch){ + if(numberInput.startsWith('//')) { + // \\n을 \n으로 변화 + const changeSlash = numberInput.replace(/\\n/g, '\n'); + const customDelimiterMatch = changeSlash.match(/^\/\/(.)\n(.*)$/); // ["//;\n1",";","1"] + + if(customDelimiterMatch) { const delimiter = customDelimiterMatch[1]; const numberString = customDelimiterMatch[2]; - numbers = numberString.split(delimiter); + numbers = numberString.split(delimiter) // 분리된 숫자들 } else { - numbers = input.split(/[,:]/) + numbers = numberInput.split(/[,:]/) } } else { - numbers = input.split(/[,:]/) + numbers = numberInput.split(/[,:]/) } - let sum = 0; + let sumNumbers = 0; + + for(const num of numbers) { + const parsedNumber = Number(num) - for(const num of numbers){ - const number = Number(num); - - // 음수 검증 - if (number < 0) { - throw new Error("[ERROR]"); + if(parsedNumber < 0) { + throw new Error('[ERROR] 음수는 입력할 수 없습니다. ') } - - sum += number || 0; + + sumNumbers += parsedNumber || 0 } - Console.print(`결과: ${sum}`) + Console.print(`결과 : ${sumNumbers}`) } } - export default App; + +// 음수 검증은 초반에 하는 것이 아닌 커스텀과 문자열 분리 후 하는 것이 옳다. -> 숫자끼리 비교가 되어야 하기 때문 From 8b5c89f5e519b0bad8340230b12e649a041619a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=88=98=EC=97=B0?= Date: Mon, 20 Oct 2025 22:05:16 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactore:=20=EC=A3=BC=EC=84=9D=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.js b/src/App.js index b10f0245..2ed76043 100644 --- a/src/App.js +++ b/src/App.js @@ -29,6 +29,7 @@ class App { let sumNumbers = 0; + // 숫자 더하기 for(const num of numbers) { const parsedNumber = Number(num) From 47ec07262f91315bbef48c971bba7b21ec8be9f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=9D=BC=EB=AA=BD=EC=9D=B4?= Date: Mon, 20 Oct 2025 22:08:40 +0900 Subject: [PATCH 5/5] Revise feature list in README.md Updated the feature list section in README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b37f062..3771d5c4 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ --- -## 구현할 기능 목록 (커밋 단위) +## 구현할 기능 목록 1. **README.md 작성 및 초기 세팅** 2. **기본 덧셈 기능 구현**