수학 문제.
예전에 처음 이문제를 봤을 때 원의 접점을 구하는 문제라고 생각 못했던 것 같다.
항상 그렇듯 알고리즘 문제에는 문제에 정말 많은 힌트가 들어있다 여기서도 변수에 r이라는 힌트가 주어져 있다.
그 말은 r은 원의 반지름. 원을 이용해서 풀라는 말이다.
문제 접근 방식
우선 두 원이 있을때 어떤 경우들이 있는지 확인해 보았다.
그렇게 보니 총 여섯 가지가 나오게 되었다. 따라서 두 원의 중점 사이의 거리, 반지름끼리의 합과 차만 알면
이 조건들을 구현할 수 있다.
우선 math.h 라이브러리를 사용해서 두 원의 중점 사이의 거리를 구할때 제곱과 루트 메서드를 사용했다.
- pow(수, 지수) : 수를 지수승 한다.
- sqrt(수) : 수에 루트를 씌운다.
메인함수의 시작부분에는 테스트 케이스 수를 입력받는다.
그리고 x의 거리차이를 담을 x_dist 변수와 y의 거리차이를 담을 y_dist 변수를 담는다.
이 때 x_dist와 y_dist는 int 정수형으로 선언해도 되지만
point_dist는 꼭 실수형으로 선언해야 한다.
이것 때문에 한 번 틀렸습니다를 받았다.
그리고 x의 거리차를 구하고 y의 거리차를 구해서 두 정점사이의 거리를 구한다.
그리고 반지름 끼리의 합과 차를 구해준다.
그리고 조건에 맞게 출력해 준다. if와 else if를 쓸 땐 작은 부분부터 검사하는 것이 좋다.
처음에 Math.h를 include해서 컴파일 에러가 났다. math.h로 고쳐서 제출했는데 틀렸습니다. 가 나왔다.
조건은 완벽하다 생각했는데 게시판에 반례를 찾아도 다 맞게 나왔다.
찾다 보니 정수가 아닌 실수라서 틀렸을 것 같아서 중점사이 거리 변수 point_dist를 double형으로 바꿔서
제출했더니 맞았다.
자료형의 범위, int형과 double형은 정말 다 구현해서 틀리게 만드는 원인인 것 같다.
'원'과 관련된 문제라고 보여지면 쉽게 생각할 수 있는 문제였던 것 같다.
나는 이 문제를 접했을 때 이미 원에 관련된 문제라는 걸 알고 접근해서 좀 아쉽다.
코드 전문은 위에서 확인 가능하다.
'알고리즘 > Baekjoon' 카테고리의 다른 글
[C++] 백준 9095번 1, 2, 3 더하기 (0) | 2021.07.28 |
---|---|
[C++] 백준 1260번 DFS와 BFS (0) | 2021.07.27 |
[C++] 백준 10989번 수 정렬하기 3 (0) | 2021.07.21 |
[C++] 백준 10282번 해킹 (0) | 2021.07.20 |
[C++] 백준 15649번 N과 M (1) (0) | 2021.07.20 |