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
15 changes: 15 additions & 0 deletions src/main/java/CoordinateMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import io.InputScanner;
import io.ResultView;
import model.Figure;

public class CoordinateMain {
public static void main(String[] args) {
InputScanner scanner = new InputScanner();
Figure figure = scanner.input();

double result = figure.calculateResult();

ResultView view = new ResultView(figure, result);
view.print();
}
}
37 changes: 37 additions & 0 deletions src/main/java/enumclass/FigureType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package enumclass;

import model.*;

public enum FigureType {
LINE(2){
@Override
public Figure of(Points points) {
return new Line(points);
}
},
TRIANGLE(3){
@Override
public Figure of(Points points) {
return new Triangle(points);
}
},
RECTANGLE(4){
@Override
public Figure of(Points points) {
return new Rectangle(points);
}
};

private final int pointNum;
public abstract Figure of(Points points);

FigureType(int pointNum) {
this.pointNum = pointNum;
}

public int getPointNum(){
return pointNum;
}


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

import model.Figure;
import validator.FigureValidator;

import java.util.Scanner;

public class InputScanner {
private final Scanner scanner;

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

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

public Figure validateInput(String input){
try{
return FigureValidator.validate(input);
} catch(IllegalArgumentException ex){
System.out.println(ex.getMessage());
return input();
}
}


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

import model.Figure;
import model.Graph;

public class ResultView {
private Figure figure;
private Graph graph;
private double result;

public ResultView(Figure figure, double result){
this.figure = figure;
this.graph = Graph.from(figure);
this.result = result;
}

public void print(){
StringBuilder[] graphDrawing = graph.draw();

for (StringBuilder drawing : graphDrawing){
System.out.println(drawing.toString());
}

System.out.println(figure.printResult(result));
}

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

public class ErrorMessages {
public static final String INVALID_PATTERN = "입력이 올바르지 않습니다. 다시 입력해주세요.";
public static final String INVALID_NUMBER = "숫자가 아닌 값은 입력할 수 없습니다. 다시 입력해주세요.";
public static final String INVALID_RECTANGLE = "직사각형이 아닌 좌표는 입력할 수 없습니다. 다시 입력해주세요.";
public static final String INVALID_RANGE = "좌표값은 0부터 24까지만 입력 가능합니다. 다시 입력해주세요.";

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

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

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

protected Points points;

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

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


public List<Double> calculateAllLength(){
List<Double> lineLengths = new ArrayList<>();

// TODO
for(int i=0; i<points.size(); i++){
for(int j=i+1; j<points.size(); j++){
double distance = calculateDistance(points.getPoint(i), points.getPoint(j));
lineLengths.add(distance);

}
}

Collections.sort(lineLengths);

return lineLengths;
}

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 void draw(StringBuilder[] graph) {
for(int i=0; i<points.size(); i++){
points.getPoint(i).drawPoint(graph);
}
}
}
16 changes: 16 additions & 0 deletions src/main/java/model/FigureFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package model;

import enumclass.FigureType;
import util.CoordinateUtils;

import java.util.List;

public class FigureFactory {

public static Figure createFigure(FigureType type, String input){
List<Integer> numbers = CoordinateUtils.splitStringToInteger(input);
Points points = Points.from(numbers);
return type.of(points);
}

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

public class Graph {
private final static int TOTAL_X_SIZE = 48;
private final static int TOTAL_Y_SIZE = 26;
private final static int X_LINE = 24;
private final static int X_NUMBER_LINE = 25;
private final static int MAX_NUMBER = 24;

private Figure figure;
private StringBuilder[] graph;

public Graph(Figure figure){
this.figure = figure;
initGraph();
}

public void initGraph(){
graph = new StringBuilder[TOTAL_Y_SIZE];

for (int i=0; i<=X_LINE; i++){
graph[i] = new StringBuilder(" ".repeat(TOTAL_X_SIZE));
}
}

public static Graph from(Figure figure){
return new Graph(figure);
}

public StringBuilder[] draw(){
drawY();
drawX();
figure.draw(graph);

return graph;
}


public void drawY(){
int yNum = MAX_NUMBER;

for(int i=0; i<MAX_NUMBER; i++){
drawYLine(i, yNum);
yNum -= 1;
}
}

public void drawYLine(int i, int yNum){
String str = " |";

if (i % 2 == 0){
str = String.format("%2d|", yNum);
}

graph[i].replace(0, 3, str);
}


public void drawX(){
drawXLine();
drawXNumber();
}

public void drawXLine(){
graph[X_LINE].replace(0, TOTAL_X_SIZE, " +" + "―".repeat(TOTAL_X_SIZE));
}

public void drawXNumber(){
graph[X_NUMBER_LINE] = new StringBuilder();

for(int i=0; i<=MAX_NUMBER; i+=2){
graph[X_NUMBER_LINE].append(String.format("%-6d", i));
}
}


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

public class Line extends Figure{

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

@Override
public double calculateResult() {
double distance = calculateDistance(points.getPoint(0), points.getPoint(1));
return Math.round(distance * 100.0) / 100.0;
}

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

}
Loading