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




## 기능 요구 사항

1. **기본 덧셈 기능**
- 입력한 문자열에서 숫자를 추출하고, 쉼표(,)와 콜론(:)을 구분자로 분리하여 합을 계산합니다.
- 예시:
```
"" => 0
"1,2" => 3
"1,2,3" => 6
"1,2:3" => 6
```

2. **커스텀 구분자 지원**
- 문자열 앞부분에 `//`와 `\n` 사이에 위치한 문자를 커스텀 구분자로 사용 가능합니다.
- 예시:
```
"//;\n1;2;3" => 6
"//|\n4|5|6" => 15
```

3. **에러 처리**
- 사용자가 잘못된 값을 입력하면 `[ERROR]` 메시지와 함께 Error를 발생시킵니다.
- 애플리케이션은 예외 발생 시 종료되지만, `process.exit()`를 직접 호출하지 않습니다.
- 예시:
```
"1,a,3" => [ERROR] Invalid input
"1,,2" => [ERROR] Invalid input
```

---

## 입출력 요구 사항

- **입력**
- 구분자와 양수로 구성된 문자열
- **출력**
- 덧셈 결과
- **실행 예시**
`덧셈할 문자열을 입력해 주세요.
1,2:3
결과 : 6`


---

## 실행 환경 및 프로그래밍 요구 사항

- Node.js **22.19.0** 이상에서 실행 가능
- 프로그램 시작점: `App.js`의 `run()` 함수
- `package.json` 파일은 변경 불가
- 외부 라이브러리 사용 금지 (제공된 라이브러리만 사용)
- JavaScript Style Guide 준수
- 종료 시 `process.exit()` 호출 금지

---

## 사용 라이브러리

- `@woowacourse/mission-utils`의 Console API 사용
- 사용자 입력: `Console.readLineAsync()`
- 출력: `Console.print()`

---

## 구현할 기능 목록

1. **README.md 작성 및 초기 세팅**
2. **기본 덧셈 기능 구현**
3. **쉼표(,)와 콜론(:) 구분자 처리 기능 구현**
4. **커스텀 구분자 처리 기능 구현**
5. **잘못된 입력 처리 및 에러 메시지 구현**
6. **Console API를 활용한 입력/출력 구현**
7. **`App.js`의 `run()` 함수에서 전체 실행 흐름 구현**
8. **테스트 케이스 작성 및 검증**
47 changes: 45 additions & 2 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,48 @@
import { Console } from "@woowacourse/mission-utils";

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

// 입력하지 않을 경우 결과 0 출력
if(!numberInput || numberInput.length === 0){
throw new Error('[ERROR] 덧셈할 문자열을 입력해 주세요.')
}

let numbers;

if(numberInput.startsWith('//')) {
// \\n을 \n으로 변화
const changeSlash = numberInput.replace(/\\n/g, '\n');
const customDelimiterMatch = changeSlash.match(/^\/\/(.)\n(.*)$/); // ["//;\n1",";","1"]

if(customDelimiterMatch) {
const delimiter = customDelimiterMatch[1];
const numberString = customDelimiterMatch[2];
numbers = numberString.split(delimiter) // 분리된 숫자들
} else {
numbers = numberInput.split(/[,:]/)
}
} else {
numbers = numberInput.split(/[,:]/)
}

let sumNumbers = 0;

// 숫자 더하기
for(const num of numbers) {
const parsedNumber = Number(num)

if(parsedNumber < 0) {
throw new Error('[ERROR] 음수는 입력할 수 없습니다. ')
}

sumNumbers += parsedNumber || 0
}

Console.print(`결과 : ${sumNumbers}`)
}
}
export default App;

// 음수 검증은 초반에 하는 것이 아닌 커스텀과 문자열 분리 후 하는 것이 옳다. -> 숫자끼리 비교가 되어야 하기 때문