본문 바로가기
PS/BOJ

[자바] 백준 2936 - 채식주의자 (boj java)

by Nahwasa 2022. 5. 10.

문제 : 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();
    }
}

댓글