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
51 changes: 50 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,50 @@
# javascript-calculator-precourse
# javascript-calculator-precourse

## 문자열 덧셈 계산기

### 구현할 기능 목록

1. 빈 문자열을 입력할 경우 0을 반환하는 기능

- 입력: `""`
- 출력: `0`

2. 쉼표(,)를 구분자로 가지는 문자열에서 숫자의 합을 반환하는 기능

- 입력: `"1,2"`
- 출력: `3`

3. 콜론(:)을 구분자로 가지는 문자열에서 숫자의 합을 반환하는 기능

- 입력: `"1:2"`
- 출력: `3`

4. 쉼표(,)와 콜론(:)을 함께 사용하여 문자열에서 숫자의 합을 반환하는 기능

- 입력: `"1,2:3"`
- 출력: `6`

5. 커스텀 구분자를 지정하여 문자열에서 숫자의 합을 반환하는 기능

- 커스텀 구분자: `"//;\n"`
- 입력: `"//;\n1;2;3"`
- 출력: `6`

6. 잘못된 값이 입력될 경우 에러 메시지를 출력하고 프로그램을 종료하는 기능

- 음수가 입력된 경우:
- 입력: `"-1,2,3"`
- 출력: `[ERROR] 음수는 허용되지 않습니다.`
- 숫자가 아닌 값이 입력된 경우:
- 입력: `"1,a,3"`
- 출력: `[ERROR] 잘못된 값이 입력되었습니다.`
- 잘못된 커스텀 구분자가 입력된 경우:
- 입력: `"//;n1;2;3"`
- 출력: `[ERROR]`
- 빈 문자열이 포함된 경우:
- 입력: `"1,,2,,3"`
- 출력: `[ERROR]`

7. 숫자 하나만 입력했을 때 해당 숫자를 그대로 반환하는 기능
- 입력: `"1"`
- 출력: `1`
58 changes: 57 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,61 @@
import { MissionUtils } from "@woowacourse/mission-utils";

class App {
async run() {}
async run() {
try {
const input = await MissionUtils.Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n");
const result = this.calculate(input);
MissionUtils.Console.print(`결과 : ${result}`);
} catch (error) {
MissionUtils.Console.print(`[ERROR] ${error.message}`);
throw error;
}
}

calculate(input) {
if (!input) {
return 0;
}

let delimiter = /[,|:]/;
let numbersString = input;

if (input.startsWith("//")) {
const delimiterEndIndex = input.indexOf("\\n");

if (delimiterEndIndex === -1) {
throw new Error("[ERROR]");
}

const customDelimiter = input.substring(2, delimiterEndIndex);

numbersString = input.substring(delimiterEndIndex + 2);

delimiter = customDelimiter;
}

const singleNumber = Number(numbersString.trim());
if (!isNaN(singleNumber)) {
return singleNumber;
}

const numbers = numbersString.split(delimiter).map((num) => {
const trimmedNum = num.trim();

if (trimmedNum === "") {
throw new Error("[ERROR]");
} else if (isNaN(Number(trimmedNum))) {
throw new Error("[ERROR]");
}
return Number(trimmedNum);
});

if (numbers.some((num) => num < 0)) {
throw new Error("[ERROR]");
}

return numbers.reduce((acc, curr) => acc + curr, 0);
}
}

export default App;