diff --git a/README.md b/README.md index 13420b2..057d3e0 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +## 기능 목록 + +1. 사용자의 입력을 받아 문자열을 처리한다 +2. 기본 구분자(쉼표 `,` 또는 콜론 `:`)를 기준으로 숫자를 추출한다. +3. 추출한 숫자들의 합을 계산하여 반환한다. +4. 커스텀 구분자 기능을 지원한다. + - 문자열 앞부분에 `//구분자\n` 형식이 포함된 경우 해당 구분자를 사용하여 숫자를 분리한다. +5. 입력값이 비어있을 경우 `0`을 반환한다. +6. 입력값이 숫자가 아닌 경우 예외(`IllegalArgumentException`)를 발생시킨다. +7. `@woowacourse/mission-utils`의 `Console.readLineAsync`를 사용하여 입력을 받고, `Console.print`를 사용하여 결과를 출력한다. \ No newline at end of file diff --git a/src/App.js b/src/App.js index 091aa0a..6a7c75c 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,50 @@ +import { Console } from "@woowacourse/mission-utils"; + class App { - async run() {} + + escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + async play() { + + try { + const input = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); + // 사용자가 입력한 "\n"을 실제 개행 문자로 치환 + const replacedInput = input.replace(/\\n/g, "\n"); + const trimmedInput = replacedInput.trim(); + const result = this.calculate(trimmedInput); + Console.print(`결과 : ${result}`); + } catch (error) { + Console.print(error.message); + } + + } + + calculate(input) { + if (!input) return 0; + + let delimiter = /[,:]/; + const customDelimeterMatch = input.match(/^\/\/(.)\n(.*)/); + + if (customDelimeterMatch) { + const escapedDelimiter = this.escapeRegExp(customDelimeterMatch[1]) + delimiter = new RegExp(escapedDelimiter); + input = customDelimeterMatch[2]; + } + + const numbers = input.split(delimiter).map(num => { + const parsed = Number(num); + if (isNaN(parsed) || parsed < 0 ) { + throw new Error("IllegalArgumentException: 잘못된 입력값입니다."); + } + return parsed; + }); + + return numbers.reduce((sum, num) => sum + num, 0); + } } +const app = new App(); +app.play(); + export default App;