diff --git a/README.md b/README.md index bd90ef0247..2ea87d24c0 100644 --- a/README.md +++ b/README.md @@ -1 +1,7 @@ -# java-calculator-precourse \ No newline at end of file +## 구현할 기능 목록 +- [ ] 빈 문자열 또는 null 입력이면 0 반환 +- [ ] 쉼표(,), 콜론(:)을 구분자로 가지는 문자열은 분리하여 합산 +- [ ] 커스텀 구분자 지정 가능("//<구분자>\n" 형식, 한 글자) +- [ ] 잘못된 입력(숫자 이외, 음수·0, 공백 등 비정상 형식) 시 IllegalArgumentException 발생 +- [ ] 입출력: Console.readLine()으로 입력 받고 "결과 : <합>" 출력 +- [ ] IllegalArgumentException 발생 후 애플리케이션 종료 diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..bed1ee292e 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,14 @@ package calculator; +import camp.nextstep.edu.missionutils.Console; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + + System.out.println("덧셈할 문자열을 입력해 주세요."); + String input = Console.readLine(); + + int result = StringAddCalculator.add(input); + System.out.println("결과 : " + result); } } diff --git a/src/main/java/calculator/StringAddCalculator.java b/src/main/java/calculator/StringAddCalculator.java new file mode 100644 index 0000000000..172dd6a291 --- /dev/null +++ b/src/main/java/calculator/StringAddCalculator.java @@ -0,0 +1,48 @@ +package calculator; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StringAddCalculator { + private static final String DEFAULT_DELIMS = "[,:]"; + private static final Pattern CUSTOM = Pattern.compile("^//(.)\\n(.*)$"); // //;\n1;2;3 + + private StringAddCalculator() {} + + public static int add(String input) { + if (input == null || input.isBlank()) return 0; + + input = input.replace("\\n", "\n"); + + String[] tokens = tokenize(input); + validate(tokens); + + long sum = 0; + for (String t : tokens) { + int n = Integer.parseInt(t); + sum += n; + if (sum > Integer.MAX_VALUE) throw new IllegalArgumentException("[ERROR] int overflow"); + } + return (int) sum; + } + + private static String[] tokenize(String input) { + Matcher m = CUSTOM.matcher(input); + if (m.matches()) { + String delim = Pattern.quote(m.group(1)); // 1글자 커스텀 구분자 + String body = m.group(2); + if (body.isEmpty()) throw new IllegalArgumentException("[ERROR] 잘못된 입력 형식"); + return body.split(delim); + } + return input.split(DEFAULT_DELIMS); + } + + private static void validate(String[] tokens) { + for (String s : tokens) { + if (s == null || s.isBlank()) throw new IllegalArgumentException("[ERROR] 빈 토큰"); + if (!s.matches("\\d+")) throw new IllegalArgumentException("[ERROR] 숫자만 허용"); + int n = Integer.parseInt(s); + if (n <= 0) throw new IllegalArgumentException("[ERROR] 0/음수 불가"); + } + } +}