[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