-
백준 6322번 직각 삼각형의 두 변 :: 마이구미알고리즘 풀이/수학 2017. 5. 20. 22:10반응형
이번 글은 백준 알고리즘 문제 6322번 "직각 삼각형의 두 변" 을 다뤄본다.
사실 제목만 봐도 무슨 문제인지 파악할 수 있다.
중등과정 피타고라스의 공식을 활용하면 문제를 풀 수 있다.
사실 상 쉬운 문제로써, 글의 주제거리가 될만큼은 아니지만 좋은 문제라고 판단했다.
문제는 피타고라스의 공식의 약간의 응용이 필요하다.
피타고라스 공식, 소수점 포맷, 제곱근 3가지만 알고 있다면, 무난히 해결할 수 있다.
직각 삼각형의 세 변의 길이 a, b, c가 주어진다. a, b, c중 하나는 -1이며, -1은 알 수 없는 변의 길이이다. 다른 두 수는 10,000보다 작거나 같은 자연수이다.
주어지지 않는 한 가지 변의 길이를 찾는 문제가 된다.
a^2 + b^2 = c^2
a^2 + b^2 - c^2 = 0
피타고라스의 공식을 위와 같이 표현할 수 있다.
그 후, 주어진 변을 이용해보자.
(a^2 + b^2) - c^2 => c 가 주어지지 않을 경우
(a^2 - c^2) + b^2 => b 가 주어지지 않을 경우
(b^2 - c^2) + a^2 => a 가 주어지지 않을 경우
a 또는 b가 주어지지 않는 경우, 빨간색 괄호의 수는 음수여야 직각 삼각형이 가능해진다.
음수가 아닐 경우 세 변의 길이 계산 결과는 0보다 커지기 때문이다.
if (a == -1) { if ((c * c) - (b * b) <= 0) { sb.append("Impossible.\n"); } else { sb.append("a = " + df.format(Math.sqrt((c * c) - (b * b))) + "\n"); } } else if (b == -1) { if ((c * c) - (a * a) <= 0) { sb.append("Impossible.\n"); } else { sb.append("b = " + df.format(Math.sqrt((c * c) - (a * a))) + "\n"); } } else { sb.append("c = " + df.format(Math.sqrt((a * a) + (b * b))) + "\n"); }
소수점 관련 변환은 DecimalFormat 클래스 또는 String.format 메소드를 이용하면 된다.
DecimalFormat df = new DecimalFormat("0.000"); String.format( "%.3f", n);
전체 소스는 아래 Github URL을 참고하길 바란다.
백준 알고리즘 6322번 "직각 삼각형의 두 변" 전체 소스
https://github.com/hotehrud/acmicpc/blob/master/math/6322.java
반응형'알고리즘 풀이 > 수학' 카테고리의 다른 글
백준 2942번 퍼거슨과 사과 [최대공약수] :: 마이구미 (0) 2017.05.23 백준 13900번 순서쌍의 곱의 합 [부분합] :: 마이구미 (0) 2017.05.21 백준 3060번 욕심쟁이 돼지 :: 마이구미 (0) 2017.05.16 백준 1339번 단어 수학 :: 마이구미 (4) 2017.05.05 백준 9047번 6174 [카프리카 수] :: 마이구미 (0) 2017.05.03