diff --git a/README.md b/README.md index 13420b29..3771d5c4 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. **테스트 케이스 작성 및 검증** diff --git a/src/App.js b/src/App.js index 091aa0a5..2ed76043 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,48 @@ +import { Console } from "@woowacourse/mission-utils"; + class App { - async run() {} -} + async run () { + const numberInput = await Console.readLineAsync('덧셈할 문자열을 입력해 주세요. \n'); + + // 입력하지 않을 경우 결과 0 출력 + if(!numberInput || numberInput.length === 0){ + throw new Error('[ERROR] 덧셈할 문자열을 입력해 주세요.') + } + + let numbers; + + 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) // 분리된 숫자들 + } else { + numbers = numberInput.split(/[,:]/) + } + } else { + numbers = numberInput.split(/[,:]/) + } + + let sumNumbers = 0; + // 숫자 더하기 + for(const num of numbers) { + const parsedNumber = Number(num) + + if(parsedNumber < 0) { + throw new Error('[ERROR] 음수는 입력할 수 없습니다. ') + } + + sumNumbers += parsedNumber || 0 + } + + Console.print(`결과 : ${sumNumbers}`) + } +} export default App; + +// 음수 검증은 초반에 하는 것이 아닌 커스텀과 문자열 분리 후 하는 것이 옳다. -> 숫자끼리 비교가 되어야 하기 때문