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
79 changes: 79 additions & 0 deletions README-HS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
## 요구사항
1. 좌표값을 두 개 입력한 경우 두 점을 잇는 직선으로 가정
2. 좌표와 좌표값 사이 '-' 문자로 구분
3. 좌표값을 네 개 입력한 경우 네 점을 연결하는 사각형으로 가정
- 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사
- 사각형인 경우 사각형 넓이를 계산해서 출력
4. 좌표값을 세 개 입력한 경우, 세 점을 연결하는 삼각형으로 가정한다.
5. 삼각형인 경우 삼각형의 넓이를 계산해서 출력한다.


## 프로그래밍 요구사항
1. depth 2를 넘지 않도록 구현 (1까지만 허용)
2. 3항 연산자 금지
3. else 예약어 금지
4. switch/case 금지
5. 메소드 10줄 넘어가지 않도록 구현
6. 일급 컬렉션


## 실행 결과
```
좌표를 입력하세요.
(10,10)-(14,15)-(20,8)


24|
|
22|
|
20|
|
18|
|
16|
| ●
14|
|
12|
|
10| ●
|
8| ●
|
6|
|
4|
|
2|
|
+――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
0 2 4 6 8 10 12 14 16 18 20 22 24

삼각형의 넓이는 29.0
```

## 힌트
1. 사각형 면적은 width * height 방식으로 계산할 수 있다.
2. Point 라는 객체를 추가해 x, y 좌표를 관리하도록 한다.

- 직사각형 좌표
(10,10)-(22,10)-(22,18)-(10,18)
(2,3)-(2,10)-(7,3)-(7,10)
(4,6)-(4,15)-(12,6)-(12,15)

- 직사각형이 아닌 좌표
(3,5)-(7,14)-(15,18)-(21,3)
(2,8)-(9,17)-(18,6)-(23,11)

- 마름모
(12,6)-(18,18)-(6,18)-(0,6)
(6,12)-(12,18)-(18,12)-(12,6)

- 선
(10,10)-(14,15)
두 점 사이 거리는 6.403124

(10,10)-(14,15)
(10,10)-(22,10)-(22,18)
(10,10)-(22,10)-(22,18)-(10,18)
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
12 changes: 12 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import io.InputView;
import model.Figure;

public class Main {
public static void main(String[] args) {
InputView inputView = new InputView();
Figure figure = inputView.input();

double result = figure.calculateResult();
System.out.println(figure.print(result));
}
}
8 changes: 8 additions & 0 deletions src/main/java/exception/CoordinateException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package exception;

public class CoordinateException extends RuntimeException{
public CoordinateException(String errorMessage){
super(errorMessage);
}

}
8 changes: 8 additions & 0 deletions src/main/java/exception/ErrorMessages.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package exception;

public class ErrorMessages {
public static String INVALID_INPUT_NUMBER = "숫자가 아닌 값은 입력할 수 없습니다.";
public static String OVER_NUMBER = "숫자 범위를 초과하였습니다.";
public static String NOT_RECTANGLE = "직사각형이 아닙니다.";
public static String INVALID_COORDINATE = "유효하지 않은 도형입니다.";
}
36 changes: 36 additions & 0 deletions src/main/java/io/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io;

import exception.CoordinateException;
import model.Figure;
import model.FigureFactory;
import utils.CoordinateUtils;

import java.util.List;
import java.util.Scanner;

public class InputView {

private final Scanner scanner;

public InputView() {
this.scanner = new Scanner(System.in);
}

public Figure input(){
System.out.println("좌표를 입력하세요");
return getFigure();
}

private Figure getFigure() {
try{
String input = scanner.nextLine();
List<Integer> numbers = CoordinateUtils.splitNumbers(input);
return new FigureFactory().create(numbers);
} catch (CoordinateException ex){
System.out.println(ex.getMessage());
return input();
}
}


}
46 changes: 46 additions & 0 deletions src/main/java/model/Figure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public abstract class Figure {
private static final int SQUARE_EXPONENT = 2;
private static final double ROUNDING_FACTOR = 100.0;

protected Points points;
protected List<Double> linesLength;

public Figure(Points points){
this.points = points;
this.linesLength = calculateAllDistance();
}

public abstract double calculateResult();
public abstract String print(double result);

public List<Double> calculateAllDistance(){
List<Double> distances = new ArrayList<>();

for(int i=0; i<points.size(); i++){
for(int j=i+1; j<points.size(); j++){
distances.add(calculateDistance(points.getPoint(i), points.getPoint(j)));
}
}

Collections.sort(distances);
return distances;
}

public double calculateDistance(Point point1, Point point2){
double xDistance = Math.pow((point1.minusX(point2)), SQUARE_EXPONENT);
double yDistance = Math.pow((point1.minusY(point2)), SQUARE_EXPONENT);

return Math.sqrt(xDistance + yDistance);
}

public double roundToSecondDecimal(double result){
return Math.round(result * ROUNDING_FACTOR) / ROUNDING_FACTOR;
}

}
32 changes: 32 additions & 0 deletions src/main/java/model/FigureFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package model;

import exception.CoordinateException;
import exception.ErrorMessages;
import utils.CoordinateUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class FigureFactory {
private static Map<Integer, Function<Points, Figure>> creator;

static {
creator = new HashMap<>();
creator.put(Line.LINE_POINT_SIZE, Line::from);
creator.put(Triangle.TRIANGLE_POINT_SIZE, Triangle::from);
creator.put(Rectangle.RECTANGLE_POINT_SIZE, Rectangle::from);
}

public Figure create(List<Integer> numbers) {
Points points = Points.from(numbers);
Function<Points, Figure> figure = creator.get(points.size());

if(figure == null){
throw new CoordinateException(ErrorMessages.INVALID_COORDINATE);
}

return figure.apply(points);
}
}
27 changes: 27 additions & 0 deletions src/main/java/model/Line.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package model;

public class Line extends Figure {
public static final int LINE_POINT_SIZE = 2;

public Line(Points points){
super(points);
}

public static Line from(Points points) {
return new Line(points);
}

@Override
public double calculateResult() {
double distance = linesLength.get(0);
return roundToSecondDecimal(distance);
}

@Override
public String print(double result) {
return "두 점 사이 거리는 " + result;
}



}
59 changes: 59 additions & 0 deletions src/main/java/model/Point.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package model;

import exception.CoordinateException;
import exception.ErrorMessages;

import java.util.Objects;

public class Point {
private static final int MAX_COORDINATE = 24;
private static final int MIN_COORDINATE = 0;
private int x;
private int y;

public Point(){}

public Point(int x, int y){
validateRange(x, y);
this.x = x;
this.y = y;
}

public static Point of(int x, int y){
return new Point(x, y);
}

public void validateRange(int x, int y) {
if (!isCorrectRange(x) || !isCorrectRange(y)){
throw new CoordinateException(ErrorMessages.OVER_NUMBER);
}
}

public boolean isCorrectRange(int value) {
return value <= MAX_COORDINATE && value >= MIN_COORDINATE;
}

public int minusX(Point other){
return this.x - other.x;
}

public int minusY(Point other){
return this.y - other.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);
}


}
31 changes: 31 additions & 0 deletions src/main/java/model/Points.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package model;

import java.util.ArrayList;
import java.util.List;

public class Points {
private List<Point> points;

public Points(List<Point> points){
this.points = points;
}

public static Points from(List<Integer> numbers){
List<Point> points = new ArrayList<>();

for(int i=0; i<numbers.size(); i+=2){
Point point = Point.of(numbers.get(i), numbers.get(i+1));
points.add(point);
}

return new Points(points);
}

public int size(){
return points.size();
}

public Point getPoint(int index){
return points.get(index);
}
}
Loading