본문 바로가기
Programming/BOJ

[C/C++] 백준 #1002 터렛(수학)

by 작은별하나 2019. 12. 16.
반응형

이 문제는 백준 사이트에 가입하고 처음 풀었던 것 같습니다.

 

지식인에서 백준 알고리즘 문제를 물어보았는데, 답변을 달기 위해서 백준 알고리즘에 가입했고, 그 후 몇문제를 풀었던 기억이 납니다.

당시에는 연세대를 다닐때였으니까, 연세대로 등록을 했었는데, 벌써 몇년 전 일이네요.

꽤 오래전부터 프로젝트 오일러 사이트에 익숙했었던 탓에, 백준과 같이 실제 채점서버가 있는 사이트는 거의 안 했었는데, 최근에 다시 시작했습니다.

 

이 문제의 정답 비율은 19%로 상당히 낮은데, 사실 문제의 난이도보다는 문제의 설명이 알아듣기 힘들어서인 듯 하다.  문제를 푼 사람들이 설정한 문제의 난이도는 Silver IV입니다.

 

Terret

.

문제의 링크입니다.

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

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

해결해야 할 문제는 두 점을 중심으로 하는 원을 그리고, 그 교점의 수를 계산하는 프로그램을 작성하는 것입니다. 이 문제를 해결하기 위해서는 두 원의 위치 관계에 따라서 교점의 수가 달라질 수 있음을 고려해야 합니다.

두 원이 완전히 떨어져서 만나지 않는 경우, 두 원이 포함 관계에 있어서 교점이 없는 경우, 두 원이 두 군데 교점이 있는 경우, 두 원이 접하는 경우(내접 또는 외접), 그리고 두 원이 완전히 겹치는 경우가 있을 수 있습니다. 이러한 경우들을 고려하여 프로그램을 작성해야 합니다. 좌표와 반지름이 모두 정수형이므로, 실수형 계산은 최소화하는 것이 좋습니다.

백준 사이트에서는 문제를 출제할 때, 재미를 위해서, 그리고 누군가는 틀려주기를 원하면서 문제를 출제하는 경우가 있습니다. 이러한 이유로 인해 호불호가 생길 수 있습니다. 하지만, 이 문제를 해결하는 것은 중요한 것이므로, 차분히 문제를 분석하고 프로그램을 작성해 보시기 바랍니다.

 

아래의 소스는 참고용으로.

//------------------------------------------------------------------------------
//	baekjoon #1002 - Turret
//		- by Aubrey Choi
//		- created at 2015-02-02
//------------------------------------------------------------------------------
#include <stdio.h>

int main()
{
    int n;
    int x1, y1, x2, y2, r1, r2;

    scanf("%d", &n);

    while( n-- )
    {
        scanf("%d%d%d%d%d%d", &x1, &y1, &r1, &x2, &y2, &r2);
        int d = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
        if( d == 0 )
        {
            if( r1 == r2 ) printf("-1\n");
            else printf("0\n");
        }
        else if( d < r1*r1 || d < r2*r2 )
        {
            int c = (r1-r2)*(r1-r2);
            if( c == d ) printf("1\n");
            else if( c > d ) printf("0\n");
            else printf("2\n");
        }
        else
        {
            int c = (r1+r2)*(r1+r2);
            if( c == d ) printf("1\n");
            else if( c < d ) printf("0\n");
            else printf("2\n");
        }
    }
}
728x90

'Programming > BOJ' 카테고리의 다른 글

백준 #1009 분산처리  (0) 2019.12.20
#1007 벡터 매칭(Mathematics)  (0) 2019.12.20
[C/C++] 백준 #1005 ACM Craft(위상 정렬)  (0) 2019.12.19
백준 #1004 어린왕자  (0) 2019.12.19
백준 #1003 피보나치 함수  (0) 2019.12.16

댓글