diff --git a/README.md b/README.md index 13420b29f..be99528be 100644 --- a/README.md +++ b/README.md @@ -1 +1,50 @@ -# 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] 잘못된 값이 입력되었습니다.` + - 잘못된 커스텀 구분자가 입력된 경우: + - 입력: `"//;n1;2;3"` + - 출력: `[ERROR]` + - 빈 문자열이 포함된 경우: + - 입력: `"1,,2,,3"` + - 출력: `[ERROR]` + +7. 숫자 하나만 입력했을 때 해당 숫자를 그대로 반환하는 기능 + - 입력: `"1"` + - 출력: `1` diff --git a/src/App.js b/src/App.js index 091aa0a5d..9e325d8ac 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,61 @@ +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; + } + + let delimiter = /[,|:]/; + let numbersString = input; + + 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 singleNumber = Number(numbersString.trim()); + if (!isNaN(singleNumber)) { + return singleNumber; + } + + const numbers = numbersString.split(delimiter).map((num) => { + 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); + } } export default App;