본문 바로가기
PS/BOJ

[자바] 백준 6322 - 직각 삼각형의 두 변 (java)

by Nahwasa 2022. 11. 10.

 문제 : boj6322


 

필요 알고리즘 개념

  • 피타고라스의 정리, 기하학
    • 피타고라스의 정리를 알면 풀 수 있다! 문제에서도 공식이 주어지니 사실상 구현문제라고 봐도 될 것 같다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 


 

풀이

  경우를 나눠보면 아래와 같다.

1. c가 -1일 경우

  c^2 = a^2 + b^2 이므로, c = sqrt(a^2 + b^2) 이다(sqrt는 제곱근을 뜻한다.). a와 b는 항상 양수로 주어질 것이므로 불가능한 경우는 없다. 따라서 코드상으로는 Math.sqrt(a*a+b*b)를 출력해주기만 하면 된다.

 

2. a또는 b가 -1일 경우

  우선 가능한 경우부터 보자면, a^2 = c^2 - b^2 이므로 a = sqrt(c*c-b*b) 이다. 마찬가지로 b = sqrt(c*c-a*a)이다. 따라서 a와 b가 -1인 경우에도 답을 출력해줄 수 있다. 다만 '1'과 다르게, a나 b가 -1이라면 삼각형을 만들 수 없는 경우가 존재한다. 삼각형이어야 하므로, a혹은 b의 결과가 0이 나오면 당연히 답이 아니다. 또한 허수가 나와도 당연히 답이 아니다. 따라서 a가 -1일 경우 c*c-b*b<=0, b가 -1일 경우 c*c-a*a<=0 이라면 답이 0 혹은 허수가 되어야 하므로 Impossible을 출력해줘야 한다.

 

 


 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = 1;
        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            if (a==0&&b==0&&c==0) break;
            sb.append("Triangle #"+n++).append('\n');
            if (c == -1) {
                sb.append(String.format("c = %.3f\n\n", Math.sqrt(a*a+b*b)));
                continue;
            }

            int tmp = 0;
            if (a == -1) tmp = c * c - b * b;
            else tmp = c * c - a * a;
            if (tmp <= 0) {
                sb.append("Impossible.\n\n");
                continue;
            }

            sb.append((a==-1?"a":"b") + String.format(" = %.3f\n\n", Math.sqrt(tmp)));
        }
        System.out.print(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글