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

[문자열 덧셈 연산기] 김채빈 미션 제출합니다. #1900

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
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
45 changes: 44 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,44 @@
# java-calculator-precourse
# java-calculator-precourse

# 전제

---
1. 커스텀 구분자는 한 글자이며, 숫자가 아니다.
2. 커스텀 문자를 지정하면, 구분자는 커스텀 문자만으로 문자열을 구분한다. 즉, 디폴트 문자로 구분하지 않는다.
3. 입력 받는 숫자는 int 범위 임을 가정한다.
4. 012는 양수로 볼 수 없다.

# 기능 목록

---

1. 입력과 출력 기능
- [x] 입력
- 입력 메시지를 출력하고, 사용자로부터 입력을 받는다.
```java
// 입력 예시
덧셈할 문자열을 입력해주세요.
1,2:3

- [x] 출력
- 출력값과 함께, 출력 메시지를 출력한다.
```java
// 출력 예시
결과 : 6

2. 입력 검증
- [x] 입력 검증
1. 디폴트 구분자(,|;)와 숫자로 구성된 디폴트 패턴인지 검증한다.
2. 커스텀 구분자 설정 양식과 커스텀 구분자, 숫자로 구성된 커스텀 패턴인지 검증한다.
3. 양수 검증. 음수나 0이 있으면 안된다.
4. 각 검증단계에서 유효하다면, 패턴결과(디폴트/커스텀)를, 유효하지 않다면 예외를 반환한다.

3. 문자열 파싱
- [x] 문자열 파싱
- 검증결과에 따라 구분자를 결정한다.
- 결정된 구분자에 따라 문자열 int 리스트로 파싱한다.

4. 덧셈
- [ ] 덧셈
- int 리스트의 합을 구한다.
- 덧셈의 결과를 출력한다.
33 changes: 31 additions & 2 deletions src/main/java/calculator/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,36 @@
package calculator;

import camp.nextstep.edu.missionutils.Console;

import java.util.List;

public class Application {

static InputValidator validator = new InputValidator();
static Parser parser = new Parser();

public static void main(String[] args) {
// TODO: 프로그램 구현
Application application = new Application();
String input = application.getInputString();
PatternType patternType = validator.validate(input);
List<Integer> numbers = parser.parseToInt(input, patternType);
application.printResult(application.sumNumbers(numbers));
}

private String getInputString() {
System.out.println("덧셈할 문자열을 입력해주세요.");
return Console.readLine();
}

private void printResult(int result) {
System.out.print("결과 : " + result);
}

public int sumNumbers(List<Integer> numbers) {
int sum = 0;
for (int number : numbers) {
sum += number;
}
return sum;
}
}
}
32 changes: 32 additions & 0 deletions src/main/java/calculator/InputValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package calculator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class InputValidator {
private static final String DEFAULT_DELIMITER_PATTERN = "^[1-9][0-9]*(,|:)[1-9][0-9]*(,|:)*[1-9][0-9]*$";
private static final String CUSTOM_DELIMITER_PATTERN = "^//(.)\\\\n[1-9][0-9]*(\1[1-9][0-9]*)*$";

public PatternType validate(String input) {
if (input == null || input.isEmpty()) {
throw new IllegalArgumentException("입력이 없습니다.");
}

if (input.matches(DEFAULT_DELIMITER_PATTERN)) {
return PatternType.DEFAULT;
}

Matcher matcher = Pattern.compile(CUSTOM_DELIMITER_PATTERN).matcher(input);
if (matcher.find()) {
return PatternType.CUSTOM;
}
else {
throw new IllegalArgumentException("입력 형식이 올바르지 않습니다.");
}
}

public static void main(String[] args) {
InputValidator test = new InputValidator();
System.out.println(test.validate("//:\n1"));
}
}
40 changes: 40 additions & 0 deletions src/main/java/calculator/Parser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package calculator;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Parser {

private static final String DEFAULT_DELIMITER = "[,|:]";
private static final String CUSTOM_DELIMITER_REGEX = "^//(.)\n(.*)$";


public List<Integer> parseToInt(String input, PatternType patternType) {
String[] parsedStrings = parseWithPattern(input, patternType);
return convertStringsToNumbers(parsedStrings);
}

private String[] parseWithPattern(String input, PatternType patternType) {
String expression = input;
String delimiters = DEFAULT_DELIMITER;
if (patternType == PatternType.CUSTOM) {
Matcher matcher = Pattern.compile(CUSTOM_DELIMITER_REGEX).matcher(input);
if (matcher.find()) {
delimiters = Pattern.quote(matcher.group(1));
expression = matcher.group(2);
}
}
return expression.split(delimiters);
}

private List<Integer> convertStringsToNumbers(String[] strings) {
List<Integer> numbers = new ArrayList<>();
for (String str : strings) {
int num = Integer.parseInt(str);
numbers.add(num);
}
return numbers;
}
}
5 changes: 5 additions & 0 deletions src/main/java/calculator/PatternType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package calculator;

public enum PatternType {
DEFAULT, CUSTOM;
}