본문 바로가기
프로그래밍/알고리즘

6600 원의 둘레

by 오답노트의 주인 2022. 9. 23.

https://www.acmicpc.net/problem/6600

 

6600번: 원의 둘레

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 실수 x1, y1, x2, y2, x3, y3이 주어진다. 세 점으로 만들 수 있는 원의 지름은 백만을 넘지 않는다.

www.acmicpc.net


 

접근

처음 문제를 보았을 땐 세 점 중 두 점은 원의 지름을 의미하는게 아닌가하는 생각이 들어 각 점의 길이를 구한 후 제일 긴 길이에 2를 곱했었다. 물론 잘못된 접근이다.

 

이 사진이 적절한 반례가 된다. 결국은 세 점으로 만들어진 삼각형의 외접원을 만들고 그 둘레를 구하는 것이 문제다.

 

외접원을 만들기 위해 원의 공식을 변형시켜 연립방정식을 조립한 후 해를 구하는 방법이 있지만, 사인법칙을 이용해 더 쉽게 푸는 방법이 있다. 역시 아는 만큼 보이나보다.

 

https://m.blog.naver.com/mindmapmath/221785986852

 

[기본개념] 사인법칙, 코사인법칙

오늘 배울 사인법칙과 코사인법칙은 상당부분 중학교 때 배우는 원과 내접하는 삼각형, 사각형, 부채꼴에 ...

blog.naver.com

게시글을 읽다보면 아래의 공식이 등장한다.

$$ {a\over sinA} = {b\over sinB} = {c\over sinC} = 2r $$

원의 둘레가 //[2\pi{r}]//이므로 //[ a\over sinA]// 에 π만 곱하면 정답이다.

 

그리고 sin함수가 -1 ~ 1의 범위에 있으므로 결과에 절대값을 취해 양수로 만들어주면 된다.

미흡했던 점

삼각함수를 사용할 땐 라디안 값을 넣어야 하는데, atan2의 반환값이 라디안인걸 모르고 헤맸었다.

 

정신차려야겠다.


#include <cmath>
#include <iostream>
#define PI 3.141592653589793
#define ABS(X) ((X > 0) ? (X) : -(X))
int main() {
  double x1, x2, x3, y1, y2, y3;
  while (scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3) !=
         EOF) {
    double a = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)),
           A = atan2(y3 - y1, x3 - x1) - atan2(y2 - y1, x2 - x1);
    printf("%.2f\n", ABS(PI * a / sin(A)));
  }
}

'프로그래밍 > 알고리즘' 카테고리의 다른 글

1500 최대 곱  (1) 2022.09.20
1059 좋은 구간  (0) 2022.09.18
9465 스티커  (0) 2022.09.10
2502 떡 먹는 호랑이  (0) 2022.09.07
1876 튕기는 볼링공  (0) 2022.09.06

댓글