본문 바로가기
컴퓨터 사이언스/BOJ

[c++] 백준 #16490 외계인의 침투

by 제크와 죠세핀 2019. 11. 5.
반응형

나는 이런 문제 푸는 걸 좋아한다. 물론 기하학을 잘하진 않는다. 

 

< 풀이 >

A를 (0, 0)으로 두자.

우리는 선분AB의 길이(t)를 알고 있으므로 이를 통해 외접원의 반지름을 구할 수 있다. 왜냐하면 삼각형이 정삼각형이므로 정삼각형의 무게중심과 원의 중심이 같기 때문이다. 

이를 통해 원의 방정식을 세울 수 있고, 선분 AP의 길이 a를 알고 있으므로 두 식을 연립하면 P의 좌표를 구할 수 있다.

B와 C는 정삼각형의 꼭짓점이므로 좌표를 쉽게 구할 수 있고 이를 통해 그냥 수학 식을 코딩으로 변환만 해주면 된다.

 

- 다른 풀이 방법

점 P는 항상 점 B와 점 C 사이에 있을 것이므로 이분탐색을 하면서 점 P의 좌표를 구해도 된다고 한다.

 

< 소스 코드 >

#include <bits/stdc++.h>
using namespace std;

struct pt{
    double x;
    double y;

    pt(double a, double b){
        x = a;
        y = b;
    }
};

int main(){
    double a, t;
    cin >> a >> t;
    double p_y = -sqrt(3)*a*a/(2*t);
    double p_x = sqrt(a*a - p_y*p_y);
    pt p(p_x, p_y);
    pt b(-t/2, -sqrt(3)*t/2);
    pt c(t/2, -sqrt(3)*t/2);
    double pb = sqrt((p.x-b.x)*(p.x-b.x) + (p.y-b.y)*(p.y-b.y));
    double pc = sqrt((p.x-c.x)*(p.x-c.x) + (p.y-c.y)*(p.y-c.y));
    printf("%.0lf\n", pb*pc);
}
반응형

댓글