diff --git a/src/main/java/Figure/Calculator.java b/src/main/java/Figure/Calculator.java new file mode 100644 index 00000000..a44fd3d8 --- /dev/null +++ b/src/main/java/Figure/Calculator.java @@ -0,0 +1,7 @@ +package Figure; + +public interface Calculator { + + double calculate(); + +} diff --git a/src/main/java/Figure/Line.java b/src/main/java/Figure/Line.java new file mode 100644 index 00000000..20554402 --- /dev/null +++ b/src/main/java/Figure/Line.java @@ -0,0 +1,22 @@ +package Figure; + +import domain.Point; +import domain.Points; + +public class Line implements Calculator { + + private Points points; + + public Line(Points points) { + this.points = points; + } + + @Override + public double calculate() { + + Point point1 = points.getPoint(0); + Point point2 = points.getPoint(1); + + return point1.getDifferDistance(point2); + } +} diff --git a/src/main/java/Figure/Square.java b/src/main/java/Figure/Square.java new file mode 100644 index 00000000..30135cd7 --- /dev/null +++ b/src/main/java/Figure/Square.java @@ -0,0 +1,34 @@ +package Figure; + +import domain.Point; +import domain.Points; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Square implements Calculator { + + private Points points; + + public Square(Points points) { + this.points = points; + } + + @Override + public double calculate() { + + Point stand = points.getPoint(0); + + List lens = new ArrayList<>(); + + for(int i=1; i<4; i++) { + lens.add(stand.getDifferDistance(points.getPoint(i))); + } + + Collections.sort(lens); + + return lens.get(0)*lens.get(1); + } + +} diff --git a/src/main/java/Figure/Triangle.java b/src/main/java/Figure/Triangle.java new file mode 100644 index 00000000..6f919077 --- /dev/null +++ b/src/main/java/Figure/Triangle.java @@ -0,0 +1,35 @@ +package Figure; + +import domain.Point; +import domain.Points; + +public class Triangle implements Calculator { + + private Points points; + + public Triangle(Points points) { + this.points = points; + } + + @Override + public double calculate() { + + Point pointA = points.getPoint(0); + Point pointB = points.getPoint(1); + Point pointC = points.getPoint(2); + + double area = 0.5 * ( + this.getTriangleLine(pointA, pointB, pointC) + + this.getTriangleLine(pointB, pointC, pointA) + + this.getTriangleLine(pointC, pointA, pointB) + ); + + return Math.abs(area); + + } + + private int getTriangleLine(Point pointA, Point pointB, Point pointC) { + return pointA.getX() * (pointB.getY() - pointC.getY()); + } + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..5dbe168f --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,10 @@ +import coordinate.Process; + +public class Main { + + public static void main(String[] args) { + Process process = new Process(); + process.run(); + } + +} diff --git a/src/main/java/coordinate/Process.java b/src/main/java/coordinate/Process.java new file mode 100644 index 00000000..b777ec2e --- /dev/null +++ b/src/main/java/coordinate/Process.java @@ -0,0 +1,37 @@ +package coordinate; + +import Figure.Line; +import Figure.Square; +import Figure.Triangle; +import domain.Points; +import domain.Type; +import view.InputView; +import view.OutputView; + +public class Process { + + OutputView oView = new OutputView(); + InputView inputView = new InputView(); + + public void run() { + + oView.msgInputPoints(); + + Points points = Points.newInstance(inputView.inputPoints()); + + if(points.getSize()== Type.LINE.getCount()) { + + oView.msgOutputLine(new Line(points).calculate()); + + } else if(points.getSize()==Type.TRIANGLE.getCount()) { + + oView.msgOutputTriangle(new Triangle(points).calculate()); + + } else if(points.getSize()==Type.RECTANGLE.getCount()) { + + oView.msgOutputSquare(new Square(points).calculate()); + + } + } + +} diff --git a/src/main/java/domain/Point.java b/src/main/java/domain/Point.java new file mode 100644 index 00000000..7461f4dc --- /dev/null +++ b/src/main/java/domain/Point.java @@ -0,0 +1,52 @@ +package domain; + +import utils.Constants; + +public class Point { + + private int x; + private int y; + + private Point(int x, int y) { + + this.x = x; + this.y = y; + + } + + public static Point newInstance(int x, int y) { + + if (x < 0 || x > 24 || y < 0 || y > 24) { + throw new IllegalArgumentException(Constants.INPUT_RANGE_CHECK); + } + + return new Point(x, y); + } + + public static Point inputStrSeparator(String inStr) { + + String[] values = inStr.replaceAll("[()]", "").split(","); + + return newInstance(Integer.parseInt(values[0]), Integer.parseInt(values[1])); + + } + + public double getDifferDistance(Point point) { + + return Math.sqrt(Math.pow(x - point.getX(), 2) + Math.pow(x - point.getY(), 2)); + + } + + public int getX() { + + return this.x; + + } + + public int getY() { + + return this.y; + + } + +} diff --git a/src/main/java/domain/Points.java b/src/main/java/domain/Points.java new file mode 100644 index 00000000..455bf980 --- /dev/null +++ b/src/main/java/domain/Points.java @@ -0,0 +1,24 @@ +package domain; + +import java.util.List; + +public class Points { + + private List points; + + private Points(List points) { + this.points = points; + } + + public static Points newInstance(List points) { + return new Points(points); + } + + public Point getPoint(int idx) { + return points.get(idx); + } + + public int getSize() { + return points.size(); + } +} diff --git a/src/main/java/domain/Type.java b/src/main/java/domain/Type.java new file mode 100644 index 00000000..89d5f19a --- /dev/null +++ b/src/main/java/domain/Type.java @@ -0,0 +1,19 @@ +package domain; + +public enum Type { + + LINE(2), + TRIANGLE(3), + RECTANGLE(4); + + private final int count; + + Type(int count) { + this.count = count; + } + + public int getCount() { + return count; + } + +} diff --git a/src/main/java/utils/Constants.java b/src/main/java/utils/Constants.java new file mode 100644 index 00000000..7230dd3a --- /dev/null +++ b/src/main/java/utils/Constants.java @@ -0,0 +1,9 @@ +package utils; + +public class Constants { + + public static String INPUT_FORMAT_CHECK = "입력 좌표의 포맷을 확인"; + + public static String INPUT_RANGE_CHECK = "좌표(x,y)는 모두 최소0 부터 최대 24까지만 허용"; + +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..1cc6c935 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,63 @@ +package view; + +import domain.Point; +import domain.Type; +import utils.Constants; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +public class InputView { + + public List inputPoints() { + + List points = new ArrayList<>(); + + try { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String line = br.readLine(); + + InputView.validInputFormat(line); + + String[] pointsStr = line.split("-"); + + for(int i=0; i< pointsStr.length; i++) { + + points.add(Point.inputStrSeparator(pointsStr[i])); + + } + + } catch (IOException e) { + System.out.println(e.getMessage()); + } + + return points; + } + + public static void validInputFormat(String inStr) { + + String[] strArr = inStr.split("-"); + + if(strArr.length != Type.LINE.getCount() && strArr.length != Type.LINE.getCount() && strArr.length != Type.LINE.getCount()) { + throw new IllegalArgumentException(Constants.INPUT_FORMAT_CHECK); + } + + for(String str:strArr) { + String[] checkArr = str.replaceAll("[()]", "").split(","); + + if(checkArr.length!=2) throw new IllegalArgumentException(Constants.INPUT_FORMAT_CHECK); + + try { + Integer.parseInt(checkArr[0]); + Integer.parseInt(checkArr[1]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(Constants.INPUT_FORMAT_CHECK); + } + } + + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..10593173 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,21 @@ +package view; + +public class OutputView { + + public void msgInputPoints() { + System.out.println("좌표를 입력하세요."); + } + + public void msgOutputLine(double result) { + System.out.println("두 점 사이의 거리는 "+result); + } + + public void msgOutputSquare(double result) { + System.out.println("사각형 넓이는 "+result); + } + + public void msgOutputTriangle(double result) { + System.out.println("삼각형 넓이는 "+result); + } + +} diff --git a/src/test/java/study/InputFormatTest.java b/src/test/java/study/InputFormatTest.java new file mode 100644 index 00000000..53a1d9a5 --- /dev/null +++ b/src/test/java/study/InputFormatTest.java @@ -0,0 +1,99 @@ +package study; + +import domain.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import utils.Constants; +import view.InputView; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class InputFormatTest { + + // 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분 + @Test + @DisplayName("입력 좌표 포맷 정상 확인") + void 입력_좌표_포맷_정상_Test() { + + InputView.validInputFormat("(3,4)-(3,5)"); + + } + + @Test + @DisplayName("하나의 입력 좌표 포맷을 확인") + void 하나의_입력_좌표_포맷_Test() { + + Throwable exception1 = assertThrows(RuntimeException.class, () -> { + InputView.validInputFormat("(3,4)"); + }); + + assertEquals(Constants.INPUT_FORMAT_CHECK, exception1.getMessage()); + + } + + @Test + @DisplayName("여러개의 입력 좌표 포맷을 확인") + void 여러개_입력_좌표_포맷_Test() { + + Throwable exception3 = assertThrows(RuntimeException.class, () -> { + InputView.validInputFormat("(3,4)-(3,5)-(3,6)-(3,7)"); + }); + assertEquals(Constants.INPUT_FORMAT_CHECK, exception3.getMessage()); + + } + + @Test + @DisplayName("입력 좌표(x,y) 포맷을 확인") + void 입력_좌표_두자리_포맷_Test() { + + Throwable exception4 = assertThrows(RuntimeException.class, () -> { + InputView.validInputFormat("(3,4)-(3,5,8)"); + }); + assertEquals(Constants.INPUT_FORMAT_CHECK, exception4.getMessage()); + + } + + @Test + @DisplayName("입력 좌표 숫자 포맷을 확인") + void 입력_좌표_숫자_포맷_Test() { + + Throwable exception5 = assertThrows(RuntimeException.class, () -> { + InputView.validInputFormat("(3,4)-(3,g)"); + }); + assertEquals(Constants.INPUT_FORMAT_CHECK, exception5.getMessage()); + + } + + @Test + @DisplayName("입력_좌표_범위_정상_확인") + void 입력_좌표_정상_범위_Test() { + + Point.newInstance(0, 24); + + } + + @Test + @DisplayName("입력_좌표X_0_24범위_확인") + void 입력_좌표X_0_24범위_Test() { + + Throwable exception = assertThrows(RuntimeException.class, () -> { + Point.newInstance(-1, 24); + }); + assertEquals(Constants.INPUT_RANGE_CHECK, exception.getMessage()); + + } + + @Test + @DisplayName("입력_좌표Y_0_24범위_확인") + void 입력_좌표Y_범위_Test() { + + Throwable exception2 = assertThrows(RuntimeException.class, () -> { + Point.newInstance(0, 25); + }); + assertEquals(Constants.INPUT_RANGE_CHECK, exception2.getMessage()); + + } + + +} diff --git a/src/test/java/study/LineTest.java b/src/test/java/study/LineTest.java new file mode 100644 index 00000000..5329dfd3 --- /dev/null +++ b/src/test/java/study/LineTest.java @@ -0,0 +1,29 @@ +package study; + +import Figure.Line; +import domain.Point; +import domain.Points; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class LineTest { + + @Test + @DisplayName("선_길이_확인") + void 선_길이_Test() { + + List points = new ArrayList<>(); + + points.add(Point.newInstance(10, 10)); + points.add(Point.newInstance(10, 15)); + + Line line = new Line(Points.newInstance(points)); + double len = line.calculate(); + Assertions.assertThat(5.0).isEqualTo(len); + + } +} diff --git a/src/test/java/study/SquareTest.java b/src/test/java/study/SquareTest.java new file mode 100644 index 00000000..3d792236 --- /dev/null +++ b/src/test/java/study/SquareTest.java @@ -0,0 +1,31 @@ +package study; + +import Figure.Square; +import domain.Point; +import domain.Points; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class SquareTest { + + @Test + @DisplayName("사각형_넓이_확인") + void 사각형_넓이_Test() { + + List points = new ArrayList<>(); + + points.add(Point.newInstance(10, 10)); + points.add(Point.newInstance(10, 15)); + points.add(Point.newInstance(15, 15)); + points.add(Point.newInstance(15, 10)); + + Square square = new Square(Points.newInstance(points)); + double area = square.calculate(); + Assertions.assertThat(25.0).isEqualTo(area); + + } +} diff --git a/src/test/java/study/TriangleTest.java b/src/test/java/study/TriangleTest.java new file mode 100644 index 00000000..27c7673e --- /dev/null +++ b/src/test/java/study/TriangleTest.java @@ -0,0 +1,29 @@ +package study; + +import Figure.Triangle; +import domain.Point; +import domain.Points; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class TriangleTest { + @Test + @DisplayName("삼각형_넓이_확인") + void 삼각형_넓이_Test() { + + List points = new ArrayList<>(); + + points.add(Point.newInstance(0, 10)); + points.add(Point.newInstance(0, 0)); + points.add(Point.newInstance(10, 0)); + + Triangle triangle = new Triangle(Points.newInstance(points)); + double area = triangle.calculate(); + Assertions.assertThat(50.0).isEqualTo(area); + + } +}