diff --git a/README.md b/README.md index bd90ef0247..653ef5ed24 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다. + +> 이 문서의 작성 양식은 [프리코스 과제 가이드](https://github.com/woowacourse/woowacourse-docs/blob/e2f102b97f6b65f5ba8da09944ee8cb9b33b696a/precourse/README.md)를 참고했습니다. + +--- + +### 1. 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. + +> 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 + +--- + +### 2. 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. + +> 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. + +* 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. + +--- + +### 3.사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다. diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..1489dd9180 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,31 @@ package calculator; +import static camp.nextstep.edu.missionutils.Console.readLine; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public class Application { - public static void main(String[] args) { - // TODO: 프로그램 구현 + + public static void main(String[] args) throws IllegalArgumentException { + try { + String line = readLine(); + String regex = "[,:]"; + if (line.startsWith("//")) { + final int index = line.indexOf("\\n"); + regex = line.substring(2, index); + line = line.substring(index + 2); + } + final String[] words = line.split(regex); + List bigDecimalList = Arrays.stream(words).parallel().map(BigDecimal::new) + .collect(Collectors.toList()); + assert bigDecimalList.parallelStream().allMatch(x -> x.compareTo(BigDecimal.ZERO) > 0); + + final BigDecimal answer = bigDecimalList.parallelStream().reduce(BigDecimal.ZERO, BigDecimal::add); + System.out.printf("결과 : %s", answer.toPlainString()); + } catch (Throwable e) { + throw new IllegalArgumentException(); + } } }