diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..95290900f3 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,17 @@ package calculator; +import static camp.nextstep.edu.missionutils.Console.readLine; + +import java.io.IOError; + public class Application { - public static void main(String[] args) { - // TODO: 프로그램 구현 + + public static void main(String[] args) throws IOError { + System.out.println("덧셈할 문자열을 입력해 주세요."); + String str = readLine(); + + Calculator cal = new Calculator(str); + + System.out.println("결과 : " + cal.getResult()); } } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000000..dc54f96a2f --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,66 @@ +package calculator; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class Calculator { + private final String input; + private final Set delimiterSet = new HashSet<>(List.of(":", ",")); + private final String delimiterPattern = "//\\D\\\\n"; + + public Calculator(String input) { + this.input = input; + } + + public int getResult() { + //입력 조건 실패시 오류 발생 + if(!Validation.inputCheck(input)) throw new IllegalArgumentException("입력값이 맞지 않습니다."); + customDelimiter(); + + return addResultValues(getDelimiterSplitValues()); + } + + //커스텀 구분자 추가하기 + private void customDelimiter() { + Pattern pattern = Pattern.compile(delimiterPattern); + Matcher matcher = pattern.matcher(input); + + while (matcher.find()) { + String match = matcher.group(); + String delimiter = match.replaceAll("(//|\\\\n)", ""); + + if(delimiter.startsWith("\\")) { + delimiterSet.add("\\" + delimiter); + } else { + delimiterSet.add(delimiter); + } + } + } + + private String[] getDelimiterSplitValues(){ + String removePattern = input.replaceAll(delimiterPattern, ""); + + String regex = "[" + delimiterSet.stream().map(String::valueOf).collect(Collectors.joining("")) + "]"; + + return removePattern.split(regex); + } + + private int addResultValues(String[] values) { + if(!Validation.formatCheck(values)) throw new IllegalArgumentException("구분자가 포함되어 있습니다"); + + int sum = 0; + for (String value : values) { + sum += Integer.parseInt(value); + } + return sum; + } + + private Set getDelimiterSet() { + customDelimiter(); + return delimiterSet; + } +} \ No newline at end of file diff --git a/src/main/java/calculator/Validation.java b/src/main/java/calculator/Validation.java new file mode 100644 index 0000000000..003ead9449 --- /dev/null +++ b/src/main/java/calculator/Validation.java @@ -0,0 +1,14 @@ +package calculator; + +import java.util.Arrays; + +public class Validation { + public static boolean inputCheck(String input) { + String inputPattern = "(//\\D\\\\n)*([0-9]+)(\\D[0-9]+)*"; + return input.matches(inputPattern); + } + + public static boolean formatCheck(String[] values) { + return Arrays.stream(values).allMatch(value -> value.matches("[0-9]+")); + } +} \ No newline at end of file