forked from next-step/java-racingcar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStringAddCalculator.java
64 lines (55 loc) · 2.07 KB
/
StringAddCalculator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package study.StringAddCalculator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringAddCalculator {
private static final String COMMENT_PREFIX = "//";
private static final Pattern COMMENT_PATTERN = Pattern.compile("//(.)\n(.*)");
public static int splitAndSum(String text) {
if (isEmpty(text)) {
return 0;
}
String[] tokens = extractTokens(text);
return add(tokens);
}
// 입력이 null이거나 빈 문자열인지 확인
private static boolean isEmpty(String text) {
return text == null || text.isEmpty();
}
// 텍스트에서 토큰을 추출 (커스텀 구분자 지원)
private static String[] extractTokens(String text) {
if (text.startsWith(COMMENT_PREFIX)) {
return extractCustomDelimiterTokens(text);
}
return text.split(",|:");
}
// 커스텀 구분자 형식에서 토큰을 추출
private static String[] extractCustomDelimiterTokens(String text) {
Matcher m = COMMENT_PATTERN.matcher(text);
if (m.find()) {
String customDelimiter = m.group(1);
return m.group(2).split(Pattern.quote(customDelimiter));
}
throw new RuntimeException("커스텀 구분자 형식이 올바르지 않습니다.");
}
// 토큰들의 합을 계산
private static int add(String[] tokens) {
int sum = 0;
for (String token : tokens) {
sum += parseAndValidateNumber(token);
}
return sum;
}
// 문자열을 정수로 변환하고 유효성 검사 (음수, 숫자가 아닌 값 체크)
private static int parseAndValidateNumber(String token) {
int number;
try {
number = Integer.parseInt(token);
} catch (NumberFormatException e) {
throw new RuntimeException("숫자가 아닌 값이 포함되어 있습니다: " + token);
}
if (number < 0) {
throw new RuntimeException("음수는 허용되지 않습니다: " + number);
}
return number;
}
}