[C] 백준 1002 (터렛)
2019. 10. 8. 00:24ㆍ백준/C
*문제에 대한 내 생각
기본적인 수학능력만 있다면 괜찮게 풀 수 있다.
다만 경우의 수를 잘 나눠야 비교적 깔끔하게 풀 수 있는 문제.
*문제 풀이
-아이디어
원의 중심들을 이은 거리 d와, 각 반지름의 합 또는 차를 비교하는게 핵심이다.
두 점에서 만나는 경우가 애매하기 때문에, else로 처리하면 깔끔하게 코드를 작성할 수 있다.
-코드
몇가지의 트릭이 있다만 그리 중요한 부분은 아니다.
다만 계산의 편리성을 위한 부분이 어느정도 있으니, 주석을 보고 이해를 하면 좋은 편.
main함수 하나에다 코딩을 해도 괜찮았지만, 그리 좋은 코드는 아니므로 함수를 좀 사용했다.
위부터 보지말고 main부터 천천히 읽어갈 것.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#define _CRT_SECURE_NO_WARNINGS //scanf의 오류를 막기 위한 코드.
#include <stdio.h>
#include <string.h>
#include <math.h>
void other(int d, int r1, int r2){
int minus_sqr = pow((r1-r2),2);
if (d == minus_sqr) //두 원이 내접하는 경우
printf("%d \n", 1);
else if (d < minus_sqr) //한 원이 속하는 경우
printf("%d \n", 0);
else //두 원이 두 점에서 만난다.
printf("%d \n", 2);
}
void circle(int d, int r1, int r2) {
int plus_sqr = pow((r1+r2),2);
if(d == plus_sqr) //두 원이 외접하는 경우
printf("%d \n", 1);
else if(d > plus_sqr)
printf("%d \n", 0); //두 원이 접하지 않는 경우
else
other(d, r1, r2); //두원이 내접하거나, 한쪽이 속하거나, 두 점에서 만나거나
}
int main(void) {
int arr[6]; //배열에다 저장하는 방법을 택했다.
int num; //테스트케이스의 개수
scanf("%d", &num);
for(int i=0;i<num;i++) { //pow는 math.h에 있는 함수로, 제곱에 용이하다.
scanf("%d %d %d %d %d %d",&arr[0],&arr[1],&arr[2],&arr[3],&arr[4],&arr[5]);
/* 알다시피 두 점사이의 거리는 루트를 쓴다.
그러나 부등식이기 때문에 제곱해도 상관없으니 굳이 루트를 사용하지 않았다.
물론 d는 0보다 크거나 같기 때문에 범위걱정도 필요 없다.
*/
int d2 = pow((arr[0]-arr[3]),2) + pow((arr[1]-arr[4]),2);
if (d2 == 0 && arr[2]==arr[5]) //두 원이 같은 경우
printf("%d \n",-1);
else
circle(d2, arr[2], arr[5]); //두 원이 다른 경우
}
}
|
cs |
*결과
771바이트에 1116KB가 나왔다.
함수를 좀 사용해서 메모리를 잡아먹은 듯하다.
'백준 > C' 카테고리의 다른 글
[C] 백준 1003 (피보나치 함수) (0) | 2019.10.08 |
---|