diff --git a/README.md b/README.md index 13420b29..bfb0a1c2 100644 --- a/README.md +++ b/README.md @@ -1 +1,36 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +### 최종 산출물 + +- 입력한 문자열에서 숫자를 추출하여 더하는 계산기 + +### 구현할 기능목록 + +1. 유저가 input 값을 입력하도록 유도한다 + + - "덧셈할 문자열을 입력해 주세요." + +2. input값에 커스텀 구분자가 있는지 확인한다 + + 1. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치한다 + 2. 커스텀 구분자가 있는 경우 + + - 구분자를 추출한다 + - 구분자를 담았던 부분을 제거한다 (문자열의 "//"부터 "\n"까지) + +3. 에러처리 + + 1. 조건 + + - 합의된 구분자(쉼표, 콜론, 커스텀 구분자)와 양수가 아닌 것이 포함되어있는 경우 + + 2. 처리 + + - “[ERROR]”로 시작하는 메시지와 함께 `Error`를 발생시킨다 + - `Error`를 발생시킨 후 애플리케이션을 종료한다 + +4. 문자열에서 쉼표, 콜론 또는 커스텀 구분자를 기준으로 숫자를 추출한다 + + - 빈 문자열일때에는 0을 반환한다 + +5. 각 숫자의 합을 반환한다 diff --git a/src/App.js b/src/App.js index 091aa0a5..ddceccfd 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,45 @@ +import { MissionUtils } from "@woowacourse/mission-utils"; + class App { - async run() {} + async run() { + const input = await MissionUtils.Console.readLineAsync( + "덧셈할 문자열을 입력해 주세요.\n", + ); + + let customDelimiter; + let target = input; + + const pattern = /^\/\/(.+)\\n/; + const match = input.match(pattern); + + if (match) { + customDelimiter = match[1]; + target = input.replace(pattern, ""); + } + + const allowedDelimiters = [",", ":", customDelimiter].filter(Boolean); + const allowedPattern = new RegExp(`^[0-9${allowedDelimiters.join("")}]+$`); + + if (!allowedPattern.test(target)) { + throw new Error( + "[ERROR] 합의되지 않은 구분자나 문자가 포함되어 있습니다.", + ); + } + + const splitPattern = new RegExp(`[${allowedDelimiters.join("")}]`); + const tokens = target.split(splitPattern); + for (const token of tokens) { + if (token && Number(token) <= 0) { + throw new Error("[ERROR] 0 또는 음수는 입력할 수 없습니다."); + } + } + + const numbers = tokens.map(Number); + + const result = numbers.reduce((acc, cur) => acc + cur, 0); + + MissionUtils.Console.print(`결과 : ${result}`); + } } export default App;