알고리즘/Baekjoon

[C++] 백준 1002번 터렛

kimyunseok 2021. 7. 21. 12:17

수학 문제.

예전에 처음 이문제를 봤을 때 원의 접점을 구하는 문제라고 생각 못했던 것 같다.

항상 그렇듯 알고리즘 문제에는 문제에 정말 많은 힌트가 들어있다 여기서도 변수에 r이라는 힌트가 주어져 있다.

그 말은 r은 원의 반지름. 원을 이용해서 풀라는 말이다.

 

문제 접근 방식

우선 두 원이 있을때 어떤 경우들이 있는지 확인해 보았다.

그렇게 보니 총 여섯 가지가 나오게 되었다. 따라서 두 원의 중점 사이의 거리, 반지름끼리의 합과 차만 알면

이 조건들을 구현할 수 있다.

 

사용한 STL과 변수

우선 math.h 라이브러리를 사용해서 두 원의 중점 사이의 거리를 구할때 제곱과 루트 메서드를 사용했다.

  1. pow(수, 지수) : 수를 지수승 한다.
  2. 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형은 정말 다 구현해서 틀리게 만드는 원인인 것 같다.

 

'원'과 관련된 문제라고 보여지면 쉽게 생각할 수 있는 문제였던 것 같다.

나는 이 문제를 접했을 때 이미 원에 관련된 문제라는 걸 알고 접근해서 좀 아쉽다.

 

 

GitHub - kimyunseok/study-record: my study-record

my study-record. Contribute to kimyunseok/study-record development by creating an account on GitHub.

github.com

코드 전문은 위에서 확인 가능하다.