
내가 생각했을때 문제에서 원하는부분
첫째 줄부터 셋째 줄까지 삼각형을 이루는 점의 x좌표와 y좌표가 빈칸을 사이에 두고 주어진다.
입력되는 수는 절댓값이 10,000을 넘지 않는 정수이다.
입력으로 주어지는 세 좌표는 중복되지 않는다.
위의 경우에 따라 삼각형의 종류가 무엇인지 출력한다.
내가 이 문제를 보고 생각해본 부분
먼저 세 점의 좌표를 입력받는다.
세 점이 일직선 위에 있는지를 외적(cross product) 계산으로 확인한다.
외적 값이 0이면 일직선상으로 'X'를 출력하고 종료한다.
각 변의 길이를 계산할 때는 거리의 제곱값을 사용해 제곱근 계산을 피해서 효율성을 높였다.
세 변의 길이를 정렬해 가장 긴 변을 기준으로 각도를 판단한다.
삼각형이 정삼각형인지, 이등변삼각형인지, 아니면 세 변이 모두 다른지 판단하여 분류한다.
가장 긴 변의 제곱이 다른 두 변 제곱의 합과 같으면 직각, 크면 둔각, 작으면 예각이다.
이 정보를 토대로 조건에 맞는 문자열을 출력한다.
코드로 구현
package baekjoon.baekjoon_34;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
// 백준 1925번 문제
public class Main1355 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 좌표 입력
int[] x = new int[3];
int[] y = new int[3];
for (int i = 0; i < 3; i++) {
String[] input = br.readLine().split(" ");
x[i] = Integer.parseInt(input[0]);
y[i] = Integer.parseInt(input[1]);
}
// 세 점이 일직선상인지 확인 (외적)
int cross = (x[1] - x[0]) * (y[2] - y[0]) - (y[1] - y[0]) * (x[2] - x[0]);
if (cross == 0) {
System.out.println("X");
br.close();
return;
}
// 세 변의 길이 (거리 제곱) 계산
int[] dist = new int[3];
dist[0] = (x[0] - x[1]) * (x[0] - x[1]) + (y[0] - y[1]) * (y[0] - y[1]);
dist[1] = (x[1] - x[2]) * (x[1] - x[2]) + (y[1] - y[2]) * (y[1] - y[2]);
dist[2] = (x[2] - x[0]) * (x[2] - x[0]) + (y[2] - y[0]) * (y[2] - y[0]);
Arrays.sort(dist); // 오름차순 정렬
// 변 길이 비교
boolean allEqual = (dist[0] == dist[1]) && (dist[1] == dist[2]);
boolean twoEqual = (dist[0] == dist[1]) || (dist[1] == dist[2]);
// 가장 긴 변(dist[2])과 나머지 두 변 이용해 각도 종류 판단
// 코사인법칙 대신 피타고라스 정리 활용
if (dist[2] == dist[0] + dist[1]) {
// 90도 직각
if (allEqual) {
// 정삼각형일 수 없으므로 this case won't appear
}
if (twoEqual) System.out.println("Jikkak2Triangle");
else System.out.println("JikkakTriangle");
} else if (dist[2] > dist[0] + dist[1]) {
// 둔각 (>90도)
if (twoEqual) System.out.println("Dunkak2Triangle");
else System.out.println("DunkakTriangle");
} else {
// 예각 (<90도)
if (allEqual) {
System.out.println("JungTriangle");
} else if (twoEqual) {
System.out.println("Yeahkak2Triangle");
} else {
System.out.println("YeahkakTriangle");
}
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.