diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 3cae2d7..8431fdd 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ repositories { } dependencies { + testImplementation 'org.assertj:assertj-core:3.11.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/markdown_practice.md b/markdown_practice.md new file mode 100644 index 0000000..bfc9c65 --- /dev/null +++ b/markdown_practice.md @@ -0,0 +1,60 @@ + +# Heading 1 +___ +## Heading 2 +### Heading 3 +#### Heading 4 +##### Heading 5 +###### Heading 6 +Paragraph + + +This is the **bold** text and this is the *italic* text and let's +do ~~strikethrough~~. + + +>Don't forget to code your dream. + + +Fruits +* Apple +* Banana + +Players +- kane +- son + + +Numbers +1. first +2. second +3. third + + +CLick [wapago's github](https://github.com/wapago) + + + +![이미지 설명](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F233CB1385745B3CC14) + + +| Header | Description | +|-------:|-------------:| +| cell1 | cell2 | +|cell3|cell4| + + +To print message in the console, use +`console.log('your message')` and ... +```java +public class Example { + public static void main(String[] args) { + console.log('your messages'); + } +} +``` + + + + + diff --git a/src/Readme.md b/src/Readme.md new file mode 100644 index 0000000..2201849 --- /dev/null +++ b/src/Readme.md @@ -0,0 +1,59 @@ +# *좌표계산기(선 길이)* +___ +### 기능 요구사항 +- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. +- 좌표정보는 괄호(",")로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +- x , y 좌표 모두 최대 24까지만 입력할 수 있다. +- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. +- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +- 좌표값을 두 개 입력한 경우, 두 점을 잇는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. + +### 실행결과 +```java +좌표를 입력하세요. +(10,10)-(14,15) +``` + +### 힌트 +- 두 점 사이 거리는 제곱근((A.x - B.x)^제곱 + (A.y - B.y)^제곱)공식으로 계산할 수 있다. +- 제곱근을 구하는 수학 함수는 Math.sqrt()를 활용한다. +- 테스트 코드의 경우 double일 때 근사치를 테스트하는 경우가 많다. +### 테스트 assert 힌트 +- junit은 `assertEquals(1.414, line.length(), 0.001);` 과 같이 세번째 인자에 정밀도를 지정할 수 있다. +- assertj는 `assertThat(line.length()).isEqualTo(1.414, offset(o.00099));` 과 같이 offset 메소드르 정밀도를 지정할 수 있다. + +# *좌표계산기(사각형 면적)* +___ +### 기능 요구사항 +- 좌표값을 두 개 입력한 경우, 두 점을 잇는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-'문자로 구분한다. +- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. +- 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. +- 사각형인 경우 사각형의 넓이를 계산해서 출력한다. + +### 실행결과 +```java +좌표를 입력하세요. +(10,10)-(22,10)-(22,18)-(10,18) +``` + +### 힌트 +- 사각형 면적은 width * height 방식으로 계산할 수 있다. +- Point라는 객체를 추가해 x,y좌표를 관리하도록 한다. + + +# *좌표계산기(삼각형 면적)* +___ +### 기능 요구사항 +- 좌표값을 두 개 입력한 경우, 두 점을 잇는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-'문자로 구분한다. +- 좌표값을 세 개 입력한 경우, 세 점을 연결하는 삼각형으로 가정한다. +- 삼각형인 경우 삼각형의 넓이를 계산해서 출력한다. + +### 실행결과 +```java +좌표를 입력하세요. +(10,10)-(14,15)-(20,8) +``` + +### 힌트 +- 세 변의 길이를 알 때 삼각형의 넓이를 구하는 공식은 헤론의 공식을 이용해 구할 수 있다. \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000..45746fd --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,7 @@ +import coordinate.CoordinateCalculator; + +public class Main { + public static void main(String[] args) { + new CoordinateCalculator().start(); + } +} diff --git a/src/main/java/coffee/CaffeineBeverage.java b/src/main/java/coffee/CaffeineBeverage.java new file mode 100644 index 0000000..5be6867 --- /dev/null +++ b/src/main/java/coffee/CaffeineBeverage.java @@ -0,0 +1,21 @@ +package coffee; + +public abstract class CaffeineBeverage { + abstract void brew(); + abstract void addCondiments(); + + void prepareRecipe() { + boilWater(); + brew(); + pourInCup(); + addCondiments(); + } + + public void boilWater() { + System.out.println("물을 끓인다."); + } + + public void pourInCup() { + System.out.println("컵에 붓는다."); + } +} diff --git a/src/main/java/coffee/Coffee.java b/src/main/java/coffee/Coffee.java new file mode 100644 index 0000000..3b1ee3a --- /dev/null +++ b/src/main/java/coffee/Coffee.java @@ -0,0 +1,14 @@ +package coffee; + +public class Coffee extends CaffeineBeverage { + + @Override + void brew() { + System.out.println("필터를 활용해 커피를 내린다."); + } + + @Override + void addCondiments() { + System.out.println("설탕과 우유를 추가한다."); + } +} diff --git a/src/main/java/coffee/Tea.java b/src/main/java/coffee/Tea.java new file mode 100644 index 0000000..d4f88dd --- /dev/null +++ b/src/main/java/coffee/Tea.java @@ -0,0 +1,14 @@ +package coffee; + +public class Tea extends CaffeineBeverage{ + + @Override + void brew() { + System.out.println("티백을 담근다."); + } + + @Override + void addCondiments() { + System.out.println("레몬을 추가한다."); + } +} diff --git a/src/main/java/coordinate/CoordinateCalculator.java b/src/main/java/coordinate/CoordinateCalculator.java new file mode 100644 index 0000000..5b6ca46 --- /dev/null +++ b/src/main/java/coordinate/CoordinateCalculator.java @@ -0,0 +1,28 @@ +package coordinate; + +import coordinate.calculatorview.InputView; +//import coordinate.factory.CalculationFactory; +import coordinate.factory.CalculationFactory; +import coordinate.factory.PolygonFactory; +import coordinate.shape.Polygon; + +public class CoordinateCalculator { + private Points points; + + public void start() { + init(); + Polygon polygon = PolygonFactory.getPolygonType(this.points); + double result = CalculationFactory.calculate(polygon); + + System.out.println("result = " + result); + } + + public void init() { + InputView.askPoints(); + initPoints(InputView.getPoints()); + } + + public void initPoints(String points) { + this.points = new Points(points); + } +} diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java new file mode 100644 index 0000000..ed8d303 --- /dev/null +++ b/src/main/java/coordinate/Point.java @@ -0,0 +1,52 @@ +package coordinate; + +import java.util.ArrayList; +import java.util.List; + +public class Point { + + private final List strPointList = new ArrayList<>(); + private final int[] pointArray = new int[2]; + + private final List pointList = new ArrayList<>(); + + private int x; + private int y; + + public Point(String points) { + pointsToList(points); + parseStrPointList(this.strPointList); + setPoint(pointList); + } + + public void pointsToList(String points) { + strPointList.add(points.split(",")); + } + + public void parseStrPointList(List strPointList) { + for (String[] point : strPointList) { + pointArray[0] = Integer.parseInt(point[0]); + pointArray[1] = Integer.parseInt(point[1]); + + pointList.add(pointArray); + } + } + + public void setPoint(List pointList) { + for (int[] point : pointList) { + this.x = point[0]; + this.y = point[1]; + } + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + + +} diff --git a/src/main/java/coordinate/Points.java b/src/main/java/coordinate/Points.java new file mode 100644 index 0000000..c73d226 --- /dev/null +++ b/src/main/java/coordinate/Points.java @@ -0,0 +1,47 @@ +package coordinate; + +import java.util.*; + +public class Points { + + private final List points; + private final int length; + + public Points(String points) { + String[] splitPoints = splitPointsInput(points); + + this.length = splitPoints.length; + this.points = makePoints(splitPoints); + } + + public List getPoints() { + return points; + } + + public int getLength() { + return length; + } + + public String[] splitPointsInput(String points) { + points = points.replace("(","").replace(")",""); + + return points.split("-"); + } + + public List makePoints(String[] splitPoints) { + return Arrays.stream(splitPoints).map(Point::new).toList(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Points points1 = (Points) o; + return length == points1.length && Objects.equals(points, points1.points); + } + + @Override + public int hashCode() { + return Objects.hash(points, length); + } +} diff --git a/src/main/java/coordinate/calculatorview/InputView.java b/src/main/java/coordinate/calculatorview/InputView.java new file mode 100644 index 0000000..aaeebc4 --- /dev/null +++ b/src/main/java/coordinate/calculatorview/InputView.java @@ -0,0 +1,30 @@ +package coordinate.calculatorview; + +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class InputView { + private static final Scanner SCANNER = new Scanner(System.in); + private static final String NATURAL_NUMBER = "[0-9][0-9]*"; + private static final String POINT = "\\((" + NATURAL_NUMBER + "," + NATURAL_NUMBER + ")\\)"; + private static final Pattern POINTS_PATTERN = Pattern.compile(POINT + "(?:-" + POINT + "){1,3}"); + + public static void askPoints() { + System.out.println("좌표를 입력하세요"); + } + + public static String getPoints() { + try { + String input = SCANNER.nextLine(); + Matcher matcher = POINTS_PATTERN.matcher(input); + if (!matcher.find()) { + throw new IllegalArgumentException("좌표 입력 형식이 맞지 않습니다."); + } + + return input; + } catch(IllegalArgumentException e) { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/src/main/java/coordinate/domain/Calculatable.java b/src/main/java/coordinate/domain/Calculatable.java new file mode 100644 index 0000000..b6bf6a0 --- /dev/null +++ b/src/main/java/coordinate/domain/Calculatable.java @@ -0,0 +1,8 @@ +package coordinate.domain; + + +public interface Calculatable { + double calculateArea(); + + String getPolygonName(); +} diff --git a/src/main/java/coordinate/factory/CalculationFactory.java b/src/main/java/coordinate/factory/CalculationFactory.java new file mode 100644 index 0000000..9a04b53 --- /dev/null +++ b/src/main/java/coordinate/factory/CalculationFactory.java @@ -0,0 +1,32 @@ +package coordinate.factory; + +import coordinate.Point; +import coordinate.Points; +import coordinate.shape.Polygon; +import coordinate.shape.Straight; + +public class CalculationFactory { + + public static double calculate(Polygon polygon) { + String name = polygon.getPolygonName(); + + if (name.equals("STRAIGHT")) { + Points points = polygon.getPoints(); + + Point point1 = points.getPoints().get(0); + Point point2 = points.getPoints().get(1); + + return Straight.calculateDistance(point1, point2); + } + + if (name.equals("TRIANGLE")) { + return polygon.calculateArea(); + } + + if (name.equals("SQUARE")) { + return polygon.calculateArea(); + } + + return 0; + } +} diff --git a/src/main/java/coordinate/factory/PolygonFactory.java b/src/main/java/coordinate/factory/PolygonFactory.java new file mode 100644 index 0000000..210770c --- /dev/null +++ b/src/main/java/coordinate/factory/PolygonFactory.java @@ -0,0 +1,34 @@ +package coordinate.factory; + +import coordinate.Points; +import coordinate.shape.Polygon; +import coordinate.shape.Square; +import coordinate.shape.Straight; +import coordinate.shape.Triangle; + +public class PolygonFactory { + + public static Polygon getPolygonType(Points points) { + int length = points.getLength(); + + if (length == 2) { + Polygon straight = new Straight(points); + + return straight; + } + + if (length == 3) { + Triangle triangle = new Triangle(points); + + return triangle; + } + + if (length == 4) { + Square square = new Square(points); + + return square; + } + + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/coordinate/shape/Polygon.java b/src/main/java/coordinate/shape/Polygon.java new file mode 100644 index 0000000..6b99029 --- /dev/null +++ b/src/main/java/coordinate/shape/Polygon.java @@ -0,0 +1,38 @@ +package coordinate.shape; + +import coordinate.Points; +import coordinate.domain.Calculatable; + +public abstract class Polygon implements Calculatable { + protected final Points points; + protected final String polygonName; + + public Polygon(Points points, int pointNumber, String polygonName) { + if (points.getLength() != pointNumber) + errorMessage(); + + this.points = points; + this.polygonName = polygonName; + + } + + abstract void errorMessage(); + + public Points getPoints() { + return points; + } + + @Override + public double calculateArea() { + if (points.getLength() >= 3){ + return calculateArea(); + } + + return 0; + } + + @Override + public String getPolygonName() { + return this.polygonName; + } +} diff --git a/src/main/java/coordinate/shape/Square.java b/src/main/java/coordinate/shape/Square.java new file mode 100644 index 0000000..0718685 --- /dev/null +++ b/src/main/java/coordinate/shape/Square.java @@ -0,0 +1,51 @@ +package coordinate.shape; + +import coordinate.Points; + +import java.util.HashSet; +import java.util.Set; + +public class Square extends Polygon { + + private static final String POLYGON_NAME = "SQUARE"; + private static final int POINT_NUMBER = 4; + protected final Points points; + + public Square(Points points) { + super(points, POINT_NUMBER, POLYGON_NAME); + this.points = points; + } + + @Override + public double calculateArea() { + Set xPoints = new HashSet(); + Set yPoints = new HashSet(); + + int result = 0; + + for (int i = 0; i < POINT_NUMBER; i++) { + xPoints.add(this.points.getPoints().get(i).getX()); + yPoints.add(this.points.getPoints().get(i).getY()); + } + + if (xPoints.size() == 2 && yPoints.size() == 2) { + Integer[] vertical = new Integer[2]; + Integer[] horizonal = new Integer[2]; + + vertical[0] = (Integer)xPoints.stream().sorted().toArray()[0]; + vertical[1] = (Integer)xPoints.stream().sorted().toArray()[1]; + + horizonal[0] = (Integer)yPoints.stream().sorted().toArray()[0]; + horizonal[1] = (Integer)yPoints.stream().sorted().toArray()[1]; + + result = (horizonal[1] - horizonal[0]) * (vertical[1] - vertical[0]); + } + + return (double) result; + } + + @Override + void errorMessage() { + throw new IllegalArgumentException("사각형은 최소 4개의 점이 필요합니다."); + } +} diff --git a/src/main/java/coordinate/shape/Straight.java b/src/main/java/coordinate/shape/Straight.java new file mode 100644 index 0000000..b1c875a --- /dev/null +++ b/src/main/java/coordinate/shape/Straight.java @@ -0,0 +1,32 @@ +package coordinate.shape; + +import coordinate.Point; +import coordinate.Points; + +public class Straight extends Polygon { + + protected static final String POLYGON_NAME = "STRAIGHT"; + protected static final int POINT_NUMBER = 2; + protected final Points points; + + public Straight(Points points) { + super(points, POINT_NUMBER, POLYGON_NAME); + this.points = points; + } + + public static double calculateDistance(Point point1, Point point2) { + int x1 = point1.getX(); + int y1 = point1.getY(); + + int x2 = point2.getX(); + int y2 = point2.getY(); + + + return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2)); + } + + @Override + void errorMessage() { + throw new IllegalArgumentException("선은 최소 2개의 점이 필요함."); + } +} diff --git a/src/main/java/coordinate/shape/Triangle.java b/src/main/java/coordinate/shape/Triangle.java new file mode 100644 index 0000000..5894ae3 --- /dev/null +++ b/src/main/java/coordinate/shape/Triangle.java @@ -0,0 +1,51 @@ +package coordinate.shape; + +import coordinate.Point; +import coordinate.Points; + +import java.util.Arrays; +import java.util.List; + +public class Triangle extends Polygon { + + private static final String POLYGON_NAME = "TRIANGLE"; + private static final int POINT_NUMBER = 3; + protected final Points points; + + public Triangle(Points points) { + super(points, POINT_NUMBER, POLYGON_NAME); + this.points = points; + } + + @Override + public double calculateArea() { + List distances = getDistances(); + + double a = distances.get(0); + double b = distances.get(1); + double c = distances.get(2); + + double s = (a + b + c) / 2; + + return Math.sqrt(s * (s - a) * (s - b) * (s - c)); + } + + private List getDistances() { + List vertexes = points.getPoints(); + Point point1 = vertexes.get(0); + Point point2 = vertexes.get(1); + Point point3 = vertexes.get(2); + + double distance1 = Straight.calculateDistance(point1, point2); + double distance2 = Straight.calculateDistance(point2, point3); + double distance3 = Straight.calculateDistance(point1, point3); + + return Arrays.asList(distance1, distance2, distance3); + } + + + @Override + void errorMessage() { + throw new IllegalArgumentException("삼각형은 최소 3개의 점이 필요합니다."); + } +}