Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,12 @@
# java-calculator-precourse
# java-calculator-precourse

## 기능 목록

- [x] 빈 문자열 입력 시 0을 반환한다.
- [x] 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다.
- [x] 쉼표(,) 구분자로 두 숫자를 입력할 경우 두 숫자의 합을 반환한다.
- [x] 쉼표(,) 또는 콜론(:) 구분자로 여러 숫자를 입력할 경우 모든 숫자의 합을 반환한다.
- [x] 커스텀 구분자를 지정할 수 있다. "//구분자\n" 형식으로 커스텀 구분자를 지정하고, 이후 문자열에서 해당 구분자로 숫자를 분리한다.
- [x] 음수를 입력할 경우 IllegalArgumentException을 발생시킨다.
- [x] 사용자로부터 문자열을 입력받는다.
- [x] 계산 결과를 "결과 : {result}" 형식으로 출력한다.
10 changes: 9 additions & 1 deletion src/main/java/calculator/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
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();

StringCalculator calculator = new StringCalculator();
int result = calculator.calculate(input);

System.out.println("결과 : " + result);
}
}
48 changes: 48 additions & 0 deletions src/main/java/calculator/StringCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package calculator;

public class StringCalculator {

public int calculate(String input) {
if (input == null || input.isEmpty()) {
return 0;
}

String delimiter = "[,:]";
String numbersString = input;

if (input.startsWith("//")) {
int delimiterEndIndex = input.indexOf("\n");
if (delimiterEndIndex == -1) {
delimiterEndIndex = input.indexOf("\\n");
if (delimiterEndIndex != -1) {
String customDelimiter = input.substring(2, delimiterEndIndex);
delimiter = escapeRegex(customDelimiter);
numbersString = input.substring(delimiterEndIndex + 2);
}
} else {
String customDelimiter = input.substring(2, delimiterEndIndex);
delimiter = escapeRegex(customDelimiter);
numbersString = input.substring(delimiterEndIndex + 1);
}
}

String[] numbers = numbersString.split(delimiter);
return sum(numbers);
}

private String escapeRegex(String delimiter) {
return delimiter.replaceAll("[\\[\\]{}()*+?.\\\\^$|]", "\\\\$0");
}

private int sum(String[] numbers) {
int total = 0;
for (String number : numbers) {
int value = Integer.parseInt(number);
if (value < 0) {
throw new IllegalArgumentException();
}
total += value;
}
return total;
}
}
52 changes: 52 additions & 0 deletions src/test/java/calculator/StringCalculatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package calculator;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

class StringCalculatorTest {

@Test
void 빈_문자열_입력시_0_반환() {
StringCalculator calculator = new StringCalculator();
int result = calculator.calculate("");
assertThat(result).isEqualTo(0);
}

@Test
void 숫자_하나_입력시_해당_숫자_반환() {
StringCalculator calculator = new StringCalculator();
assertThat(calculator.calculate("1")).isEqualTo(1);
assertThat(calculator.calculate("5")).isEqualTo(5);
}

@Test
void 쉼표_구분자로_두_숫자_입력시_합_반환() {
StringCalculator calculator = new StringCalculator();
assertThat(calculator.calculate("1,2")).isEqualTo(3);
}

@Test
void 쉼표_또는_콜론_구분자로_여러_숫자_입력시_합_반환() {
StringCalculator calculator = new StringCalculator();
assertThat(calculator.calculate("1,2,3")).isEqualTo(6);
assertThat(calculator.calculate("1:2:3")).isEqualTo(6);
assertThat(calculator.calculate("1,2:3")).isEqualTo(6);
}

@Test
void 커스텀_구분자_사용() {
StringCalculator calculator = new StringCalculator();
assertThat(calculator.calculate("//;\n1;2;3")).isEqualTo(6);
assertThat(calculator.calculate("//|\n1|2|3")).isEqualTo(6);
assertThat(calculator.calculate("//;\n1")).isEqualTo(1);
}

@Test
void 음수_입력시_예외_발생() {
StringCalculator calculator = new StringCalculator();
assertThatThrownBy(() -> calculator.calculate("-1,2,3"))
.isInstanceOf(IllegalArgumentException.class);
}
}