Skip to content
37 changes: 36 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,36 @@
# javascript-calculator-precourse
# javascript-calculator-precourse

### 최종 산출물

- 입력한 문자열에서 숫자를 추출하여 더하는 계산기

### 구현할 기능목록

1. 유저가 input 값을 입력하도록 유도한다

- "덧셈할 문자열을 입력해 주세요."

2. input값에 커스텀 구분자가 있는지 확인한다

1. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치한다
2. 커스텀 구분자가 있는 경우

- 구분자를 추출한다
- 구분자를 담았던 부분을 제거한다 (문자열의 "//"부터 "\n"까지)

3. 에러처리

1. 조건

- 합의된 구분자(쉼표, 콜론, 커스텀 구분자)와 양수가 아닌 것이 포함되어있는 경우

2. 처리

- “[ERROR]”로 시작하는 메시지와 함께 `Error`를 발생시킨다
- `Error`를 발생시킨 후 애플리케이션을 종료한다

4. 문자열에서 쉼표, 콜론 또는 커스텀 구분자를 기준으로 숫자를 추출한다

- 빈 문자열일때에는 0을 반환한다

5. 각 숫자의 합을 반환한다
42 changes: 41 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -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;