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
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,25 @@
# javascript-calculator-precourse
# 과제 - 문자열 덧셈 계산기

## 기능 요구 사항

입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.

쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6
앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다.
예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다.
사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다.

## 기능 목록 정리

1. 문자열을 입력 받는다

1-1. 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료한다.

1-2. 빈문자열 또는 null일 경우 0을 반환

2. 문자열에서 구분자를 기준으로 숫자를 추출 한다

3. 추출한 숫자의 합을 구한다

4. 결과값을 출력한다.
70 changes: 69 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,73 @@
import { Console } from "@woowacourse/mission-utils";

class StringCalculator {
parseAndValidateNumber(str) {
const trimmedStr = str.trim();

if (trimmedStr === "") {
throw new Error("[ERROR] 구분자 사이에 숫자가 없습니다.");
}

const num = Number(trimmedStr);

if (isNaN(num) || !Number.isInteger(num)) {
throw new Error(
"[ERROR] 유효하지 않은 숫자(정수 아님)가 포함되어 있습니다."
);
}

if (num <= 0) {
throw new Error("[ERROR] 양수만 입력할 수 있습니다.");
}

return num;
}

calculate(text) {
if (text === "") {
return 0;
}

let numbers;

if (text.startsWith("//")) {
const match = text.match(/^\/\/(.)\n(.*)/s);
if (!match) {
throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다.");
}

const customDelimiter = match[1];
const numbersString = match[2];

numbers = numbersString
.split(customDelimiter)
.map(this.parseAndValidateNumber);
} else {
numbers = text.split(/[,\:]/).map(this.parseAndValidateNumber);
}

return numbers.reduce((sum, num) => sum + num, 0);
}
}

class App {
async run() {}
constructor() {
this.calculator = new StringCalculator();
}

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

const result = this.calculator.calculate(userInput);
Console.print(`결과 : ${result}`);
} catch (error) {
Console.print(error.message);
throw error;
}
}
}

export default App;