문제 : boj2936
우선 이 문제를 풀기위한 가장 기본이 되는 개념부터 알아야 한다. 초등학교나 언젠가 배웠을테지만 까먹었을 수도 있으므로! 삼각형의 넓이는 한 변만 x나 y축에 평행하다면, 평행한 면의 길이 w와, 그와 수직인 높이 h에 대해 w*h/2 로 구할 수 있다. 즉, 아래와 같은 삼각형 3개(검정, 주황, 초록)는 w가 셋 다 동일하고 h도 동일하므로 다른 것 처럼 생겼지만 사실 넓이는 전부 동일하다.
위의 개념만 잘 알고 있다면 문제에서 제시된 삼각형의 어느 지점의 한 점이 주어지더라도 두 구역의 넓이를 동일하게 하는 넓이를 구할 수 있다. 예를들어 아래처럼 주황선으로 나뉜 구역의 넓이는 다음과 같이 w와 h를 잡으면 된다.
이 문제의 경우 입력에 따라 다양한 경우가 존재한다. 따라서 경우에 따라 계산을 달리 해줘야 한다. 모든 경우는 다음과 같다(그림의 영문자는 코드의 주석이 해당 경우를 처리한 코드임을 의미한다). 입력으로 들어온 두 수를 각각 a, b라고 표현했다. 이하 풀이는 모든 경우와, 그에 따라 나올 수 있는 답의 범위만을 나타낸다. 계산식은 코드를 참고하자.
코드 : 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));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// [A]
if (a+b==0) {
System.out.println("125.00 125.00");
return;
}
double base = 250.0*250.0/2;
// [B]
if (a>0 && b>0) {
System.out.println(String.format(a>b?"0.00 %.2f":"%.2f 0.00", 250.0 - base / Math.max(a, b)));
return;
}
// [C]
if (a<125 && b==0) {
double tmp = 250.0 - base / (250-a);
System.out.println(String.format("%.2f %.2f", tmp, 250.0-tmp));
return;
}
// [D]
if (a==0 && b<125) {
double tmp = 250.0 - base / (250-b);
System.out.println(String.format("%.2f %.2f", 250.0-tmp, tmp));
return;
}
// [E]
if (b==0) {
System.out.println(String.format("0.00 %.2f", base/a));
return;
}
// [F]
System.out.println(String.format("%.2f 0.00", base/b));
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 11880 - 개미 (boj java) (0) | 2022.05.11 |
---|---|
[자바] 백준 1110 - 더하기 사이클 (boj java) (0) | 2022.05.11 |
[자바] 백준 8892 - 팰린드롬 (boj java) (0) | 2022.05.09 |
[자바] 백준 2480 - 주사위 세개 (boj java) (0) | 2022.05.09 |
[자바] 백준 12981 - 공 포장하기 (boj java) (0) | 2022.05.08 |
댓글