Skip to content

Commit 188e712

Browse files
committed
feat(level3): 문자열 계산기 구현
1 parent 9980c59 commit 188e712

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

src/main/java/StringCalculator.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
public class StringCalculator {
3+
4+
public int calculate(String input) {
5+
6+
if (input == null || input.trim().isEmpty()) {
7+
return 0;
8+
}
9+
10+
// 지정 구분자
11+
String separator = ",|;";
12+
String numbers = input;
13+
14+
/**
15+
* 커스텀 구분자 체크
16+
* 1. 입력받은 문자열이 //로 시작하면 \n 으로 끝나는 사이의 값을 구분자로 지정한다.
17+
* 2. 커스텀 구분자가 정규 표현식으로 사용되는 문자일 경우 이스케이프 처리한다.
18+
*/
19+
if (input.startsWith("//")) {
20+
int newSeparatorIndex = input.indexOf("\n");
21+
22+
String customSeparator = input.substring(2, newSeparatorIndex).trim();
23+
24+
// 정규식 특수문자 앞에 /를 붙인다. [\\\\^$.|?*+()\\[\\]{}]는 정규식 특수문자를 모두 찾는 패턴, \\\\는 자바에서 \를 앞에 붙여주는 표현
25+
customSeparator = customSeparator.replaceAll("[\\\\^$.|?*+()\\[\\]{}]", "\\\\$0");
26+
27+
separator = customSeparator;
28+
29+
numbers = input.substring(newSeparatorIndex + 1).trim();
30+
}
31+
32+
if (numbers.isEmpty()) {
33+
return 0;
34+
}
35+
36+
String[] numbersArray = numbers.split(separator);
37+
38+
int sum = 0;
39+
40+
for (String number : numbersArray) {
41+
if (!isNumeric(number)) {
42+
throw new RuntimeException("숫자가 아닌 값이 포함되어있습니다.");
43+
}
44+
45+
sum += Integer.parseInt(number);
46+
}
47+
48+
return sum;
49+
}
50+
51+
private boolean isNumeric(String number) {
52+
if (number == null || number.trim().isEmpty()) {
53+
return false;
54+
}
55+
56+
for (int i = 0; i < number.length(); i++) {
57+
if (i == 0 && number.charAt(i) == '-') {
58+
return false;
59+
}
60+
61+
if (!Character.isDigit(number.charAt(i))) {
62+
return false;
63+
}
64+
}
65+
66+
return true;
67+
}
68+
}

0 commit comments

Comments
 (0)