diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..fb2df707 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,33 @@ +import calculator.Calculator; +import calculator.CalculatorFactory; +import domain.Coordinate; +import view.InputView; +import view.OutputView; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class Main { + + public static void main(String[] args) throws IOException { + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + List coordinateList = new ArrayList<>(); + double result = 0; + CalculatorFactory calculatorFactory = new CalculatorFactory(coordinateList,result); + + while (result==0){ + try { + String[] inputArray = inputView.creatCoordinate(); + Calculator calculator = calculatorFactory.calculateFactory(inputArray); + result = calculator.calculator(); + System.out.println(outputView.resultOutput(calculator,result)); + }catch (IOException e){ + System.out.println(e.getMessage()); + coordinateList.clear(); + } + } + + } + } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 00000000..9d974319 --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,11 @@ +package calculator; + +import java.io.IOException; + +public interface Calculator { + + double calculator() throws IOException; + + int getCoordinateCount(); + +} diff --git a/src/main/java/calculator/CalculatorFactory.java b/src/main/java/calculator/CalculatorFactory.java new file mode 100644 index 00000000..c3d2100a --- /dev/null +++ b/src/main/java/calculator/CalculatorFactory.java @@ -0,0 +1,41 @@ +package calculator; + +import domain.Coordinate; + +import java.io.IOException; +import java.util.List; + +public class CalculatorFactory { + private List coordinateList; + private double result; + + + public CalculatorFactory(List coordinateList,double result) { + this.coordinateList = coordinateList; + this.result = result; + } + + public Calculator calculateFactory(String[] splitInput) throws IOException { + coordinateList = addCoordinate(splitInput); + + if(coordinateList.size() == 2){ + return new CoordinateLengthCalculator(coordinateList); + } + if(coordinateList.size() == 3){ + return new TriangleCalculator(coordinateList); + } + if(coordinateList.size() == 4){ + return new SquareCalculator(coordinateList); + } + return null; + } + + private List addCoordinate(String[] splitInput) throws IOException { + for (String originalCoordinate:splitInput) { + Coordinate coordinate = new Coordinate(originalCoordinate); + coordinateList.add(coordinate); + } + return coordinateList; + } + +} diff --git a/src/main/java/calculator/CoordinateLengthCalculator.java b/src/main/java/calculator/CoordinateLengthCalculator.java new file mode 100644 index 00000000..4793786a --- /dev/null +++ b/src/main/java/calculator/CoordinateLengthCalculator.java @@ -0,0 +1,29 @@ +package calculator; + +import domain.Coordinate; + +import java.io.IOException; +import java.util.List; + +public class CoordinateLengthCalculator implements Calculator{ + private final List coordinateList; + + public CoordinateLengthCalculator(List coordinateList) { + this.coordinateList = coordinateList; + } + + @Override + public double calculator() { + int x = Math.abs(coordinateList.get(0).getX() - coordinateList.get(1).getX()); + int y = Math.abs(coordinateList.get(0).getY() - coordinateList.get(1).getY()); + double somPow = Math.pow(x, 2) + Math.pow(y, 2); + return Math.sqrt(somPow); + } + + @Override + public int getCoordinateCount() { + return coordinateList.size(); + } + + +} diff --git a/src/main/java/calculator/SquareCalculator.java b/src/main/java/calculator/SquareCalculator.java new file mode 100644 index 00000000..13524cc5 --- /dev/null +++ b/src/main/java/calculator/SquareCalculator.java @@ -0,0 +1,88 @@ +package calculator; + +import domain.Coordinate; + +import java.io.IOException; +import java.util.List; + +public class SquareCalculator implements Calculator{ + private final List coordinateList; + + public SquareCalculator(List coordinateList) { + this.coordinateList = coordinateList; + } + + @Override + public double calculator() throws IOException { + System.out.println("사각형 넓이 구하기"); + //삐뚤어진 사각형인지 아닌지 먼저 검증 + validateSquare(); + //가로길이 구하기 + double width = calculateWidth(coordinateList); + //세로길이 구하기 + double height = calculateHeight(coordinateList); + //넓이 계산하기 + return width * height; + } + + private void validateSquare() throws IOException { + //꼭지점 A(x,y), B(x,y),C(x,y),D(x,y) + //정사각형 또는 직사각형은 x가 두개가 같고 y가 두개가 같다. + int referenceX = coordinateList.get(0).getX(); + int referenceY = coordinateList.get(0).getY(); + int count = 0; + + for (int i = 1; i < coordinateList.size(); i++) { + if(coordinateList.get(i).getX()==referenceX &&coordinateList.get(i).getY() == referenceY){ + throw new IOException("정사각형 또는 직사각형의 좌표를 입력해주세요."); + } + if(coordinateList.get(i).getX()==referenceX || coordinateList.get(i).getY() == referenceY){ + count++; + } + } + + if (!(count ==2)){ + throw new IOException("정사각형 또는 직사각형의 좌표를 입력해주세요."); + } + + } + + @Override + public int getCoordinateCount() { + return coordinateList.size(); + } + + private double calculateWidth(List coordinateList){ + //y좌표가 같은것끼리 찾아서 ax-bx를 하면 가로길이 나옴. + Coordinate aCoordinate; + Coordinate bCoordinate = null; + + aCoordinate = coordinateList.get(0); + + for (int i = 1; i < coordinateList.size(); i++) { + if(aCoordinate.getY()==coordinateList.get(i).getY()){ + bCoordinate = coordinateList.get(i); + break; + } + } + + return Math.abs(aCoordinate.getX()-bCoordinate.getX()); + } + + private double calculateHeight(List coordinateList){ + //x좌표가 같은것끼리 찾아서 ay-by를 하면 세로길이 나옴. + Coordinate aCoordinate = null; + Coordinate bCoordinate = null; + + aCoordinate = coordinateList.get(0); + + for (int i = 1; i < coordinateList.size(); i++) { + if(aCoordinate.getX()==coordinateList.get(i).getX()){ + bCoordinate = coordinateList.get(i); + break; + } + } + + return Math.abs(aCoordinate.getY()-bCoordinate.getY()); + } +} diff --git a/src/main/java/calculator/TriangleCalculator.java b/src/main/java/calculator/TriangleCalculator.java new file mode 100644 index 00000000..40bd05c8 --- /dev/null +++ b/src/main/java/calculator/TriangleCalculator.java @@ -0,0 +1,41 @@ +package calculator; + +import domain.Coordinate; + +import java.util.List; + +public class TriangleCalculator implements Calculator{ + private final List coordinateList; + + public TriangleCalculator(List coordinateList) { + this.coordinateList = coordinateList; + } + + @Override + public double calculator() { + //꼭지점 A,B,C + Coordinate coordinateA = coordinateList.get(0); + Coordinate coordinateB = coordinateList.get(1); + Coordinate coordinateC = coordinateList.get(2); + //변AB,변BC,변CA 의 길이 + double lineLengthAB = calculateLineLength(coordinateA, coordinateB); + double lineLengthBC = calculateLineLength(coordinateB, coordinateC); + double lineLengthCA = calculateLineLength(coordinateC, coordinateA); + //헤론의 법칙 :(변AB+변BC+변CA)/2 = s + double s = (lineLengthAB + lineLengthBC + lineLengthCA)/2; + // 루트(s*(s-AB)*(s-BC)*(s-CA)) + return Math.sqrt(s * (s - lineLengthAB) * (s - lineLengthBC) * (s - lineLengthCA)); + } + + @Override + public int getCoordinateCount() { + return coordinateList.size(); + } + + private double calculateLineLength(Coordinate coordinateA, Coordinate coordinateB){ + int x = Math.abs(coordinateA.getX() - coordinateB.getX()); + int y = Math.abs(coordinateA.getY() - coordinateB.getY()); + double somPow = Math.pow(x, 2) + Math.pow(y, 2); + return Math.sqrt(somPow); + } +} diff --git a/src/main/java/domain/Coordinate.java b/src/main/java/domain/Coordinate.java new file mode 100644 index 00000000..1c9a55ad --- /dev/null +++ b/src/main/java/domain/Coordinate.java @@ -0,0 +1,45 @@ +package domain; + +import java.io.IOException; + +public class Coordinate { + int x; + int y; + + public Coordinate(String coordinateInput) throws IOException { + //인풋값에서 괄호 없애기 + coordinateInput = removeFirstAndLastChar(coordinateInput); + //,기준으로 잘라서 x,y좌표 + String[] splitCoordinate = coordinateInput.split(","); + //좌표 크기 검증 + validateCoordinateSize(splitCoordinate); + + this.x = Integer.parseInt(splitCoordinate[0]); + this.y = Integer.parseInt(splitCoordinate[1]); + } + + /** + * (10,13)에서 () 없애주는 메서드 + * @param coordinateInput : (10,13) + * @return : 10,13 + */ + private String removeFirstAndLastChar(String coordinateInput){ + return coordinateInput.substring(1,coordinateInput.length()-1); + } + + private void validateCoordinateSize(String[] splitCoordinate) throws IOException { + for (String coordinate:splitCoordinate) { + if (Integer.parseInt(coordinate)<0 || Integer.parseInt(coordinate)>24){ + throw new IOException("좌표값은 0부터 24까지만 입력해야합니다."); + } + } + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..7aa5a895 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,41 @@ +package view; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class InputView { + private BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String input; + + public String[] creatCoordinate() throws IOException { + System.out.println("(x,y)-(x,y)또는 (x,y)-(x,y)-(x,y)또는 (x,y)-(x,y)-(x,y)-(x,y)형식으로"); + System.out.println("좌표를 입력하세요"); + input = br.readLine(); + validateInput(input); + return input.split("-"); + } + + private void validateInput(String input) throws IOException{ + String coordinateInput = "\\(\\d+,\\d+\\)-\\(\\d+,\\d+\\)"; + String triangleInput = "\\(\\d+,\\d+\\)-\\(\\d+,\\d+\\)-\\(\\d+,\\d+\\)"; + String quadrangleInput = "\\(\\d+,\\d+\\)-\\(\\d+,\\d+\\)-\\(\\d+,\\d+\\)-\\(\\d+,\\d+\\)"; + + if(!(input.matches(coordinateInput)||input.matches(triangleInput)||input.matches(quadrangleInput))){ + throw new IOException("입력값을 형식에 맞게 입력해주세요."); + } + } + + + + + + + + + + + + + +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..4c209e9a --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,19 @@ +package view; + +import calculator.Calculator; +import domain.Coordinate; + +import java.util.List; + +public class OutputView { + + + public String resultOutput(Calculator calculator, double result){ + if(calculator.getCoordinateCount()==2) return String.format("두 좌표의 길이는 %.6f",result); + if(calculator.getCoordinateCount()==3) return String.format("삼각형의 넓이는 %.2f",result); + if(calculator.getCoordinateCount()==4) return String.format("사각형의 넓이는 %.1f",result); + + return ""; + }; + } + diff --git a/src/test/java/domain/CoordinateTest.java b/src/test/java/domain/CoordinateTest.java new file mode 100644 index 00000000..35465b5d --- /dev/null +++ b/src/test/java/domain/CoordinateTest.java @@ -0,0 +1,33 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class CoordinateTest { + + @DisplayName("Coordinate가 잘 생성되는지 테스트") + @Test + void createCoordinate() throws IOException { + //given + //when + Coordinate coordinate = new Coordinate("(14,24)"); + //then + Assertions.assertThat(coordinate.x).isEqualTo(14); + Assertions.assertThat(coordinate.y).isEqualTo(24); + } + + @DisplayName("좌표값은 최대 24까지만 입력해야 한다.") + @Test + void validateCoordinateSize() throws IOException { + //given + //when + //then + Assertions.assertThatThrownBy(()-> new Coordinate("(50,24)")).hasMessage("좌표값은 0부터 24까지만 입력해야합니다."); + } + +} \ No newline at end of file