diff --git a/README.md b/README.md index 13420b29..53600876 100644 --- a/README.md +++ b/README.md @@ -1 +1,25 @@ -# javascript-calculator-precourse \ No newline at end of file +# 과제 - 문자열 덧셈 계산기 + +## 기능 요구 사항 + +입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다. + +쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. +예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 +앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. +예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. +사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다. + +## 기능 목록 정리 + +1. 문자열을 입력 받는다 + +1-1. 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료한다. + +1-2. 빈문자열 또는 null일 경우 0을 반환 + +2. 문자열에서 구분자를 기준으로 숫자를 추출 한다 + +3. 추출한 숫자의 합을 구한다 + +4. 결과값을 출력한다. diff --git a/src/App.js b/src/App.js index 091aa0a5..4a0f7a45 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,73 @@ +import { Console } from "@woowacourse/mission-utils"; + +class StringCalculator { + parseAndValidateNumber(str) { + const trimmedStr = str.trim(); + + if (trimmedStr === "") { + throw new Error("[ERROR] 구분자 사이에 숫자가 없습니다."); + } + + const num = Number(trimmedStr); + + if (isNaN(num) || !Number.isInteger(num)) { + throw new Error( + "[ERROR] 유효하지 않은 숫자(정수 아님)가 포함되어 있습니다." + ); + } + + if (num <= 0) { + throw new Error("[ERROR] 양수만 입력할 수 있습니다."); + } + + return num; + } + + calculate(text) { + if (text === "") { + return 0; + } + + let numbers; + + if (text.startsWith("//")) { + const match = text.match(/^\/\/(.)\n(.*)/s); + if (!match) { + throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다."); + } + + const customDelimiter = match[1]; + const numbersString = match[2]; + + numbers = numbersString + .split(customDelimiter) + .map(this.parseAndValidateNumber); + } else { + numbers = text.split(/[,\:]/).map(this.parseAndValidateNumber); + } + + return numbers.reduce((sum, num) => sum + num, 0); + } +} + class App { - async run() {} + constructor() { + this.calculator = new StringCalculator(); + } + + async run() { + try { + const userInput = await Console.readLineAsync( + "덧셈할 문자열을 입력해 주세요.\n" + ); + + const result = this.calculator.calculate(userInput); + Console.print(`결과 : ${result}`); + } catch (error) { + Console.print(error.message); + throw error; + } + } } export default App;