Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,22 @@
# javascript-calculator-precourse
# javascript-calculator-precourse

## 기능 요구 사항

문자열 덧셈 계산기를 구현한다. 입력한 문자열에 포함된 숫자를 모두 더한 결과를 반환한다.

### 기본 규칙

- 빈 문자열 입력 시 0을 반환한다.
- 쉼표(,) 또는 콜론(:)을 구분자로 사용하여 숫자를 분리할 수 있다.

### 커스텀 구분자

- `//`와 `\n` 사이에 위치하는 문자를 커스텀 구분자로 사용할 수 있다.

### 예외 처리

- 사용자가 잘못된 값을 입력한 경우 `"[ERROR]"`로 시작하는 메시지를 출력하고 `Error`를 발생시킨 후 프로그램을 종료한다.
- 잘못된 값 예시
- 음수 입력
- 숫자가 아닌 값 입력
- 구분자 규칙을 따르지 않은 입력 등
20 changes: 19 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
import { Console } from "@woowacourse/mission-utils";

import parseInput from "./inputParser.js";
import IsInputValidate from "./validate.js";
import { calculateSumOfNumbers } from "./calculator.js";

class App {
async run() {}
async run() {
const inputs = await Console.readLineAsync(
"덧셈할 문자열을 입력해 주세요.\n"
);

const numbers = parseInput(inputs);
IsInputValidate(numbers);

const sum = calculateSumOfNumbers(numbers);
Console.print(`결과 : ${sum}`);

return;
}
}

export default App;
5 changes: 5 additions & 0 deletions src/calculator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const calculateSumOfNumbers = (numbers) => {
return numbers.reduce((acc, curr) => {
return acc + parseInt(curr);
}, 0);
};
21 changes: 21 additions & 0 deletions src/inputParser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const parseInput = (inputs) => {
const formattedInput = inputs.replace(/\\n/g, "\n");

let numbers;

if (formattedInput.startsWith("//")) {
const delimiterEndIndex = formattedInput.indexOf("\n");
const customDelimiter = formattedInput.slice(2, delimiterEndIndex);
const numbersString = formattedInput.slice(delimiterEndIndex + 1);

numbers = numbersString
.split(customDelimiter)
.flatMap((part) => part.split(",").flatMap((p) => p.split(":")));
} else {
numbers = inputs.split(/[,:]/);
}

return numbers;
};

export default parseInput;
12 changes: 12 additions & 0 deletions src/validate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const IsInputValidate = (numbers) => {
numbers.forEach((number) => {
if (number === "") {
throw new Error("[ERROR] 빈 문자열은 입력할 수 없습니다.");
}
if (number <= 0) {
throw new Error("[ERROR] 양수만 입력할 수 있습니다.");
}
});
};

export default IsInputValidate;