
내가 생각했을때 문제에서 원하는부분
각 줄은 8개의 실수로 이루어져 있는데 각각 첫 번째 변의 양 끝점의 (x,y) 좌표와 두 번째 변의 양 끝점의 (x,y) 좌표로 구성되어 있다.
모든 좌표는 미터 단위이며 mm까지 나타내야 한다.
또한 모든 좌표값은 -10000~10000의 범위를 갖는다.
각각의 입력에 대해 각 줄에 네 번째 점의 좌표를 미터 단위로 mm까지 나타내어라.
내가 이 문제를 보고 생각해본 부분
주요 좌표를 담는 Point 클래스를 만들고, 두 점 비교를 위한 isSame 메서드를 포함한다.
입력은 BufferedReader로 한 줄씩 받아 StringTokenizer로 숫자들을 분리해 처리해준다.
네 점 중 평행사변형의 인접한 두 변에 해당하는 점들을 특정하기 위해 점들을 맞바꾸는 조건문을 작성했다.
이는 문제에서 인접 변이 주어졌다는 조건을 만족시키기 위함이다.
4번째 점의 좌표는 평행사변형의 성질을 이용해
D = B + C − A
와 같은 공식을 적용해 계산한다.
출력은 소수점 셋째 자리까지 포맷팅하여 요구사항에 맞게 출력한다.
입력이 없을 때까지 반복하여 여러 케이스를 처리한다.
코드로 구현
package baekjoon.baekjoon_34;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
// 백준 1894번 문제
public class Main1356 {
static class Point {
double x, y;
Point(double x, double y) {
this.x = x;
this.y = y;
}
boolean isSame(Point other) {
return this.x == other.x && this.y == other.y;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input;
while ((input = br.readLine()) != null && !input.isEmpty()) {
StringTokenizer st = new StringTokenizer(input);
Point a = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
Point b = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
Point c = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
Point d = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
if (b.isSame(c)) {
Point temp = a;
a = b;
b = temp;
} else if (a.isSame(d)) {
Point temp = c;
c = d;
d = temp;
} else if (b.isSame(d)) {
Point tempA = a;
Point tempC = c;
a = b;
b = tempA;
c = d;
d = tempC;
}
double resX = a.x + (b.x - a.x) + (d.x - a.x);
double resY = a.y + (b.y - a.y) + (d.y - a.y);
bw.write(String.format("%.3f %.3f%n", resX, resY));
}
bw.flush();
br.close();
bw.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.