diff --git a/README.md b/README.md index 13420b29..2e190c8e 100644 --- a/README.md +++ b/README.md @@ -1 +1,22 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +## 기능 요구 사항 + +문자열 덧셈 계산기를 구현한다. 입력한 문자열에 포함된 숫자를 모두 더한 결과를 반환한다. + +### 기본 규칙 + +- 빈 문자열 입력 시 0을 반환한다. +- 쉼표(,) 또는 콜론(:)을 구분자로 사용하여 숫자를 분리할 수 있다. + +### 커스텀 구분자 + +- `//`와 `\n` 사이에 위치하는 문자를 커스텀 구분자로 사용할 수 있다. + +### 예외 처리 + +- 사용자가 잘못된 값을 입력한 경우 `"[ERROR]"`로 시작하는 메시지를 출력하고 `Error`를 발생시킨 후 프로그램을 종료한다. +- 잘못된 값 예시 + - 음수 입력 + - 숫자가 아닌 값 입력 + - 구분자 규칙을 따르지 않은 입력 등 diff --git a/src/App.js b/src/App.js index 091aa0a5..874282d7 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,23 @@ +import { Console } from "@woowacourse/mission-utils"; + +import parseInput from "./inputParser.js"; +import IsInputValidate from "./validate.js"; +import { calculateSumOfNumbers } from "./calculator.js"; + class App { - async run() {} + async run() { + const inputs = await Console.readLineAsync( + "덧셈할 문자열을 입력해 주세요.\n" + ); + + const numbers = parseInput(inputs); + IsInputValidate(numbers); + + const sum = calculateSumOfNumbers(numbers); + Console.print(`결과 : ${sum}`); + + return; + } } export default App; diff --git a/src/calculator.js b/src/calculator.js new file mode 100644 index 00000000..852acb46 --- /dev/null +++ b/src/calculator.js @@ -0,0 +1,5 @@ +export const calculateSumOfNumbers = (numbers) => { + return numbers.reduce((acc, curr) => { + return acc + parseInt(curr); + }, 0); +}; diff --git a/src/inputParser.js b/src/inputParser.js new file mode 100644 index 00000000..2ce2d624 --- /dev/null +++ b/src/inputParser.js @@ -0,0 +1,21 @@ +const parseInput = (inputs) => { + const formattedInput = inputs.replace(/\\n/g, "\n"); + + let numbers; + + if (formattedInput.startsWith("//")) { + const delimiterEndIndex = formattedInput.indexOf("\n"); + const customDelimiter = formattedInput.slice(2, delimiterEndIndex); + const numbersString = formattedInput.slice(delimiterEndIndex + 1); + + numbers = numbersString + .split(customDelimiter) + .flatMap((part) => part.split(",").flatMap((p) => p.split(":"))); + } else { + numbers = inputs.split(/[,:]/); + } + + return numbers; +}; + +export default parseInput; diff --git a/src/validate.js b/src/validate.js new file mode 100644 index 00000000..73b87d73 --- /dev/null +++ b/src/validate.js @@ -0,0 +1,12 @@ +const IsInputValidate = (numbers) => { + numbers.forEach((number) => { + if (number === "") { + throw new Error("[ERROR] 빈 문자열은 입력할 수 없습니다."); + } + if (number <= 0) { + throw new Error("[ERROR] 양수만 입력할 수 있습니다."); + } + }); +}; + +export default IsInputValidate;