Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[문자열 덧셈 계산기] 임시언 미션 제출합니다. #589

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
36 changes: 35 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,35 @@
# javascript-calculator-precourse

## **문자열 덧셈 계산기**

### **📘기능 요구 사항**

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

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

### **입출력 요구 사항**

**입력**

- 구분자와 양수로 구성된 문자열

**출력**

- 덧셈 결과

```
결과 : 6
```

## 💡생각해보기
1. 문자열을 입력받는다.
2. ,과 :을 기본 구분자로 넣는다.
3. 받은 문자열을 검사한다.
3-1. 커스텀 문자열이라면 //와\n사이에 위치한 문자를 커스텀 구분자로 사용한다.
3-2. 아니라면 기존 구분자를 사용해서 문자열을 계산한다.
3-3. 잘못된 문자열이 입력되면 "[ERROR]"로 시작하는 메시지와 함께 `Error`를 발생 시키고 종료한다.
4. 문자열 수들의 합을 구해서 "결과: 결과 값" 형식으로 출력한다.
1 change: 1 addition & 0 deletions __tests__/ApplicationTest.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import App from "../src/App.js";
import { MissionUtils } from "@woowacourse/mission-utils";


const mockQuestions = (inputs) => {
MissionUtils.Console.readLineAsync = jest.fn();

Expand Down
136 changes: 134 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 5 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@
"devDependencies": {
"@babel/core": "^7.25.8",
"@babel/preset-env": "^7.25.8",
"@woowacourse/mission-utils": "^2.2.0",
"babel-jest": "^29.6.0",
"jest": "^29.6.0"
},
"dependencies": {
"@woowacourse/mission-utils": "^2.2.0"
"jest": "^29.7.0"
},
"jest": {
"transform": {
Expand All @@ -29,5 +27,8 @@
"engines": {
"npm": ">=10.8.2",
"node": ">=20.17.0"
},
"dependencies": {
"prompt": "^1.3.0"
}
}
43 changes: 40 additions & 3 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,42 @@
import { Console } from "@woowacourse/mission-utils";

class App {
async run() {}
}
async run() {
try {

// 문자열을 입력받는다.
const input = await Console.readLineAsync("계산할 문자열을 입력해 주세요: ");

const result = this.calculate(input);
Console.print(`결과: ${result}`);
} catch (error) {
Console.print(error.message);
throw error;
}
}
calculate(input) {
//빈 문자열인지 검사
if (input === "") return 0;

export default App;
//구분자 배열 생성
let delimiterArray = [',', ':'];
// 커스텀 구분자
const customDelimiter = input.match(/^\/\/(.)\\n/);
let numString = input;

if (customDelimiter) {
//커스텀 구분자 배열에 추가
delimiterArray.push(customDelimiter[1]);
numString = input.split('\\n')[1];
}

const nums = numString.split(new RegExp(`[${delimiterArray.join('')}]`)).map(Number);

//에러처리 => 음수랑 잘못된 문자열
if (nums.some((num) => num < 0 || isNaN(num))) {
throw new Error("[ERROR] 잘못된 입력 값 입니다.");
}
return nums.reduce((sum, num) => sum + num, 0);
}
}
export default App;