diff --git a/TODO_MATRIX.md b/TODO_MATRIX.md new file mode 100644 index 00000000..24e9ef39 --- /dev/null +++ b/TODO_MATRIX.md @@ -0,0 +1,27 @@ +사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. +좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +X, Y좌표 모두 최대 24까지만 입력할 수 있다. +입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. +정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +직선인 경우는 두 점 사이 거리를 계산해서 출력한다. + +PointA, PointB + +좌표 정보 괄호'()'로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +좌표값과 좌표값 사이는 '-' 문자로 구분한다. + - [v] PointA(10,10) - PointB(14,15) + - [v] 괄호 및 쉼표 제거 후 x값과 y값을 가져오기 +[v] X, Y좌표 모두 최대 24까지만 입력할 수 있다. + - 입력 범위 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. + - 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +[v] 직선인 경우는 두 점 사이 거리를 계산해서 출력한다 + - 두 점 사이의 거리를 계산한다. + +좌표를 입력하세요. +(10,10)-(14,15) + +두 점 사이 거리는 제곱근((A.x - B.x)^제곱 + (A.y - B.y)^제곱) 공식으로 계산할 수 있다. +제곱근을 구하는 수학 함수는 Math.sqrt()를 활용한다. +테스트 코드의 경우 double일 때 근사치를 테스트하는 경우가 많다. + diff --git a/TODO_RACTANGLE.md b/TODO_RACTANGLE.md new file mode 100644 index 00000000..49ae9123 --- /dev/null +++ b/TODO_RACTANGLE.md @@ -0,0 +1,40 @@ +좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. +좌표값과 좌표값 사이는 '-' 문자로 구분한다. +좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. + +네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. +사각형인 경우 사각형의 넓이를 계산해서 출력한다. + +좌표를 입력하세요. +(10,10)-(22,10)-(22,18)-(10,18) + +사각형 면적은 width * height 방식으로 계산할 수 있다. +Point라는 객체를 추가해 x, y 좌표를 관리하도록 한다. + +1. [v] 좌표값과 좌표값 사이는 '-' 문자로 구분한다. :: [-, (, )] 제거 후 +2. [v] Rectangle 클래스에 의존성 주입하기 +3. [v] width, height 구하기 +## [v] 첫번째 포인트와 두번째 포인트가 width가 됨 또는 세번째 포인트와 네번째 포인트가 width가 됨 +## [v] 두번째 포인트와 세번째 포인트가 height가 됨 또는 두번째 포인트와 세번째 포인트가 height가 됨 +## [v] Rectangle([Point(x, y), Point(x, y), Point(x, y), Point(x, y)]) + +2. 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형(정사각형 포함)만 허용하도록 검사한다. +## Rectangle([Point(x, y), Point(x, y), Point(x, y), Point(x, y)]) + +## 1번째 방법 +1. 첫번째 포인트 y좌표와 두번째 포인트 y좌표가 동일 선상에 있어야한다. Rectangle#isHorizon() +1. 또는 세번째 포인트 y좌표와 네번째 포인트 y좌표가 동일 선상에 있어야한다. +2. 두번째 포인트 x좌표와 세번째 포인트 x좌표가 동일 선상에 있어야한다. Rectangle#isVertical() +2. 또는 세번째 포인트 x좌표와 첫번째 포인트 x좌표가 동일 선상에 있어야한다. + +## 2번째 방법 :: 이것이 편해보임 +width:(첫번째 포인트 x좌표와 두번째 포인트 x좌표의 차이) 비교 (세번째 포인트 x좌표와 네번째 포인트 x좌표의 차이) +height:(첫번째 포인트 y좌표와 네번째 포인트 y좌표의 차이) 비교 (두번째 포인트 y좌표와 세번째 포인트 y좌표의 차이) + +만약, 둘이 같지 않다면 평행하지 않으므로 => 직사각형이 아님!! Rectangle#compare(width, height) + +3. 사각형인 경우 사각형의 넓이를 계산해서 출력한다. +## 두번째 포인트에서 첫번재 포인트의 x차이 만큼이 width가 됨 또는 세번째 포인트와 네번째 포인트의 x차이만큼이 width가 됨 +## 세번째 포인트에서 두번째 포인트의 y차이 만큼이 height가 됨 또는 네번째 포인트와 첫번째 포인트의 y차이만큼이 height가 됨 +## Rectangle([Point(x, y), Point(x, y), Point(x, y), Point(x, y)]) + diff --git a/build.gradle b/build.gradle index 8172fb73..cb2e1884 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,11 @@ repositories { } dependencies { + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + testCompileOnly 'org.projectlombok:lombok:1.18.12' // 테스트 의존성 추가 + testAnnotationProcessor 'org.projectlombok:lombok:1.18.12' // 테스트 의존성 추가 testImplementation "org.junit.jupiter:junit-jupiter:5.7.2" testImplementation "org.assertj:assertj-core:3.19.0" } diff --git a/src/main/java/rectangle/Point.java b/src/main/java/rectangle/Point.java new file mode 100644 index 00000000..c80835eb --- /dev/null +++ b/src/main/java/rectangle/Point.java @@ -0,0 +1,35 @@ +package rectangle; + +import java.util.Objects; + +public class Point { + protected final int x; + protected final int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int width(Point targetPoint) { + return Math.abs(this.x - targetPoint.x); + } + + public int height(Point targetPoint) { + return Math.abs(this.y - targetPoint.y); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return x == point.x && y == point.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/main/java/rectangle/Rectangle.java b/src/main/java/rectangle/Rectangle.java new file mode 100644 index 00000000..9c085d80 --- /dev/null +++ b/src/main/java/rectangle/Rectangle.java @@ -0,0 +1,41 @@ +package rectangle; + +import java.util.ArrayList; +import java.util.List; +public class Rectangle{ + private final int width; + private final int height; + + private List points = new ArrayList<>(); + private static final int ARRAY_SIZE = 2; + + public Rectangle(List inputs) { + init(inputs); + this.width = getWith(); + this.height = getHeight(); + } + + public int getArea() { + return width * height; + } + + private void init(List inputs) { + for (int pointIndex = 0; pointIndex < inputs.size(); pointIndex++) { + points.add(new Point(inputs.get(pointIndex), inputs.get(++pointIndex))); + } + } + + private int getWith() { + return points.get(0).width(points.get(1)); + } + + private int getHeight() { + return points.get(1).height(points.get(3)); + } + + @Override + public String toString() { + return points.toString(); + } + +} diff --git a/src/main/java/triangle/Point.java b/src/main/java/triangle/Point.java new file mode 100644 index 00000000..267af37e --- /dev/null +++ b/src/main/java/triangle/Point.java @@ -0,0 +1,35 @@ +package triangle; + +import java.util.Objects; + +public class Point { + protected final int x; + protected final int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int width(Point targetPoint) { + return Math.abs(this.x - targetPoint.x); + } + + public int height(Point targetPoint) { + return Math.abs(this.y - targetPoint.y); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return x == point.x && y == point.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/main/java/triangle/Triangle.java b/src/main/java/triangle/Triangle.java new file mode 100644 index 00000000..4901624a --- /dev/null +++ b/src/main/java/triangle/Triangle.java @@ -0,0 +1,36 @@ +package triangle; + +import java.util.ArrayList; +import java.util.List; + +public class Triangle { + + private List points = new ArrayList<>(); + public Triangle(List inputs) { + init(inputs); + } + + private void init(List inputs) { + for (int pointIndex = 0; pointIndex < inputs.size(); pointIndex++) { + points.add(new Point(inputs.get(pointIndex), inputs.get(++pointIndex))); + } + } + + public double getArea() { + int a = points.get(0).height(points.get(1)); + int b = points.get(1).height(points.get(2)); + int c = points.get(0).width(points.get(2)); + int s = s(a, b, c); + + return Math.floor(Math.sqrt(s * (s - a) * (s - b) * (s - c))); + } + + public int s(int a, int b, int c) { + return (a + b + c) / 2; + } + + @Override + public String toString() { + return points.toString(); + } +} diff --git a/src/main/java/utils/Utils.java b/src/main/java/utils/Utils.java new file mode 100644 index 00000000..0912eeb7 --- /dev/null +++ b/src/main/java/utils/Utils.java @@ -0,0 +1,20 @@ +package utils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Utils { + public static final String REGEX = "[(|,|)|-]"; + + public static List split(String input) { + return Arrays.stream(input.split(REGEX)) + .filter(Utils::isNotEmpty) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList()); + } + private static boolean isNotEmpty(String input){ + return !input.isEmpty(); + } +} diff --git a/src/test/java/rectangle/RectangleTest.java b/src/test/java/rectangle/RectangleTest.java new file mode 100644 index 00000000..4511b11f --- /dev/null +++ b/src/test/java/rectangle/RectangleTest.java @@ -0,0 +1,60 @@ +package rectangle; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.setRemoveAssertJRelatedElementsFromStackTrace; + +public class RectangleTest { + private Point pointA; + private Point pointB; + private Point pointC; + + private List inputs; + + @BeforeEach + void setUp() { + pointA = new Point(10, 10); + pointB = new Point(22, 10); + pointC = new Point(22, 18); + inputs = Arrays.asList(10, 10, 22, 10, 22, 18, 10, 18); + } + + @Test + @DisplayName("특수문자가 제거된 리스트를 point 객체로 바꾸는 기능") + void 특수문자제거_point객체로변경() { + List points = Arrays.asList(new Point(10, 10), new Point(22, 10), new Point(22, 18), new Point(10, 18)); + + Rectangle rectangle = new Rectangle(inputs); + assertThat(points).hasToString(rectangle.toString()); + } + + @Test + @DisplayName("width 구하는 기능") + void getWidth() { + assertThat(pointA.width(pointB)).isEqualTo(12); + } + + @Test + @DisplayName("height 구하는 기능") + void getHeight() { + assertThat(pointB.height(pointC)).isEqualTo(8); + } + + @Test + @DisplayName("사각형의 넓이를 구하는 기능") + void getArea() { + Rectangle rectangle = new Rectangle(inputs); + int area = rectangle.getArea(); + + assertThat(area).isEqualTo(96); + } + + + +} diff --git a/src/test/java/triangle/TriangleTest.java b/src/test/java/triangle/TriangleTest.java new file mode 100644 index 00000000..1ba52841 --- /dev/null +++ b/src/test/java/triangle/TriangleTest.java @@ -0,0 +1,41 @@ +package triangle; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import utils.Utils; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.in; + +public class TriangleTest { + + private List inputs; + + + @BeforeEach + void setUp() { + inputs = Utils.split("(10,10)-(14,15)-(20,8)"); + } + + @Test + @DisplayName("특수문자가 제거된 리스트를 point 객체로 바꾸는 기능") + void 특수문자제거_point객체로변경() { + List points = Arrays.asList(new Point(10, 10), new Point(14, 15), new Point(20, 8)); + + Triangle triangle = new Triangle(inputs); + assertThat(points).hasToString(triangle.toString()); + } + + @Test + @DisplayName("삼각형 넓이 구하는 기능") + void getArea() { + Triangle triangle = new Triangle(inputs); + double area = triangle.getArea(); + assertThat(area).isEqualTo(16.0); + } + +} diff --git a/src/test/java/utils/UtilsTest.java b/src/test/java/utils/UtilsTest.java new file mode 100644 index 00000000..d60e185a --- /dev/null +++ b/src/test/java/utils/UtilsTest.java @@ -0,0 +1,20 @@ +package utils; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.AssertionsForClassTypes.*; + +public class UtilsTest { + + @Test + @DisplayName("입력 문자 중 특수문자를 제거 후 하는 기능") + void 특수문자제거(){ + assertThat(Utils.split("(10,10)-(22,10)-(22,18)-(10,18)")).isEqualTo(Arrays.asList(10, 10, 22, 10, 22, 18, 10, 18)); + } + + + +}