[OLD] 기존 글 저장

백준 1925번 JAVA 풀이 - 삼각형

한민기 2022. 6. 3. 12:15
반응형

문제 링크 : https://www.acmicpc.net/problem/1925

 

1925번: 삼각형

평면상에 세 개의 점이 주어지면, 그 세 점으로 이루어지는 삼각형은 유일하게 결정된다. 또는, 삼각형이 이루어지지 않기도 한다. 세 점의 좌표가 주어졌을 때 다음에 따라 이 삼각형의 종류를

www.acmicpc.net

문제

평면상에 세 개의 점이 주어지면, 그 세 점으로 이루어지는 삼각형은 유일하게 결정된다. 또는, 삼각형이 이루어지지 않기도 한다. 세 점의 좌표가 주어졌을 때 다음에 따라 이 삼각형의 종류를 판단하는 프로그램을 작성하시오.

  1. 세 점이 일직선 위에 있으면 - ‘삼각형이 아님’  출력할 때는 X
  2. 세 변의 길이가 같으면 - ‘정삼각형’ 출력할 때는 JungTriangle
  3. 두 변의 길이가 같으면
    1. 가장 큰 각이 90°보다 크면 - ‘둔각이등변삼각형’ 출력할 때는 Dunkak2Triangle
    2. 가장 큰 각이 90°이면 - ‘직각이등변삼각형’ 출력할 때는 Jikkak2Triangle
    3. 가장 큰 각이 90°보다 작으면 - ‘예각이등변삼각형’ 출력할 때는 Yeahkak2Triangle
  4. 세 변의 길이가 모두 다르면
    1. 가장 큰 각이 90°보다 크면 - ‘둔각삼각형’ 출혁할 때는 DunkakTriangle
    2. 가장 큰 각이 90°이면 - ‘직각삼각형’ 출력할 때는 JikkakTriangle
    3. 가장 큰 각이 90°보다 작으면 - ‘예각삼각형’ 출력할 때는 YeahkakTriangle

입력

첫째 줄부터 셋째 줄까지 삼각형을 이루는 점의 x좌표와 y좌표가 빈칸을 사이에 두고 주어진다. 입력되는 수는 절댓값이 10,000을 넘지 않는 정수이다. 입력으로 주어지는 세 좌표는 중복되지 않는다.

출력

위의 경우에 따라 삼각형의 종류가 무엇인지 출력한다.

# 문제 풀이

1. 먼저 입력받은 3개의 좌표가 한 직선상에 있는지 파악한다.

한 직선에 있으면 X를 리턴한다.

if((x2 - y2) * (y1 - z1) == (y2 - z2) *(x1 - y1)){
	System.out.println("X");
	return;
}

* (곱셈) 을 사용한 이유는 (Y축 증가량) / (X축 증가량) 으로 기울기를 구하게 되는데 이때 X축 증가량 즉 분모가 0이 나와 계산을 못할 경우도 있기 때문에 곱셈으로 바꾸어 계산한다.

 

2. 좌표 2개를 입력 받았을 때 해당 좌표사이의 길이를 제곱한 값을 리턴한다. 

0.5 제곱을 하여 루트를 씌울 경우 정확한 값으로 안떨어질 가능성도 있기 때문에 루트를 씌우지 않고 리턴한다.

static double calcLength(int x1, int x2, int y1, int y2)
{
	return Math.pow(y1 - x1, 2) + Math.pow(y2 - x2, 2);
}

 

3. 문제의 조건에 따라 세변이 같을 때, 두 변이 같을 때 모두 다를 때를 조건으로 분기하여 각각 알맞은 함수를 호출 또는 알맞은 문구를 리턴한다.

if(x == y && y == z) System.out.println("JungTriangle");

else if(x == y || y == z || x == z)
{
	if(x >= y && x >= z) check2Q(x, y, z);
	else if(y >= x && y >= z) check2Q(y, x, z);
	else check2Q(z, x, y);
}

else
{
	if(x >= y && x >= z) checkQ(x, y, z);
	else if(y >= x && y >= z) checkQ(y, x, z);
	else checkQ(z, x, y);
}

 

 

# 전체 코드

코드를 훨씬 짧게 main 함수에 모두 선언하고 작업할 수 있지만 가시성이 떨어지기 때문에 함수로 구분하여 문제를 해결

import java.util.*;

public class Main_1925{
    public static void main(String[] args)
    {

        Scanner sc = new Scanner(System.in);

        double x, y, z = 0;
        int x1 = sc.nextInt();
        int x2 = sc.nextInt();
        int y1 = sc.nextInt();
        int y2 = sc.nextInt();
        int z1 = sc.nextInt();
        int z2 = sc.nextInt();

        if((x2 - y2) * (y1 - z1) == (y2 - z2) *(x1 - y1)){
            System.out.println("X");
            return;
        }

        x = calcLength(x1, x2, y1, y2);
        y = calcLength(y1, y2, z1, z2);
        z = calcLength(z1, z2, x1, x2);

        findMax(x, y, z);
    }

    static double calcLength(int x1, int x2, int y1, int y2)
    {
        return Math.pow(y1 - x1, 2) + Math.pow(y2 - x2, 2);
    }

    static void findMax(double x, double y, double z)
    {
        if(x == y && y == z) System.out.println("JungTriangle");

        else if(x == y || y == z || x == z)
        {
            if(x >= y && x >= z) check2Q(x, y, z);
            else if(y >= x && y >= z) check2Q(y, x, z);
            else check2Q(z, x, y);
        }

        else
        {
            if(x >= y && x >= z) checkQ(x, y, z);
            else if(y >= x && y >= z) checkQ(y, x, z);
            else checkQ(z, x, y);
        }
        return;
    }

    static void check2Q(double max, double a, double b)
    {
        if(a + b == max) System.out.println("Jikkak2Triangle");
        else if(a +b < max) System.out.println("Dunkak2Triangle");
        else System.out.println("Yeahkak2Triangle");
        return;
    }

    static void checkQ(double max, double a, double b)
    {
        if(a + b == max) System.out.println("JikkakTriangle");
        else if(a +b < max) System.out.println("DunkakTriangle");
        else System.out.println("YeahkakTriangle");
        return;
    }
}
반응형