알고리즘/BOJ

백준 1002번 터렛

꾸준함. 2018. 5. 1. 12:00

문제 링크입니다: https://www.acmicpc.net/problem/1002


기하학 알고리즘 문제였습니다.

크게는 2가지 경우의 수, 작게는 7가지 경우의 수를 고려하면 되는 문제였습니다.

2차원 평면에서 점과 점 사이의 거리 공식은 워낙 유명하기 때문에 설명을 생략하겠습니다.


1. 한 원의 중심이 다른 원 안에 있는 경우

a) 동일 원인 경우

b) 접점이 없는 경우(작은 반지름 + 두 중심 사이의 거리 < 큰 반지름)

c) 접점이 하나인 경우(작은 반지름 + 두 중심 사이의 거리 = 큰 반지름)

d) 접점이 두개인 경우(작은 반지름 + 두 중심 사이의 거리 > 큰 반지름)

2. 각 원의 중심이 다른 원 안에 없는 경우

a) 접점이 없는 경우(작은 반지름 + 큰 반지름 < 두 중심 사이의 거리)

b) 접점이 하나인 경우(작은 반지름 + 큰 반지름 = 두 중심 사이의 거리)

c) 접점이 두개인 경우(작은 반지름 + 큰 반지름 > 두 중심 사이의 거리)


물론, 기하 문제는 언제나처럼 말로 설명하는 것보다 직접 그려보는 것이 이해하는데 도움이 됩니다.


#include <iostream>

#include <algorithm>

#include <cmath>

using namespace std;

 

int x, y, r;

int x2, y2, r2;

pair<int, int> coord1, coord2;

 

double getDistance(void)

{

        //기본 공식

        return sqrt(pow(coord2.first - coord1.first, 2.0) + pow(coord2.second - coord1.second, 2.0));

}

 

void printContactNum(void)

{

        double distance = getDistance();

        int shortR = min(r, r2); //짧은 반지름

        int longR = max(r, r2); //긴 반지름

 

        if (distance <= longR) //원 안에 다른 원의 중심이 있는 경우

        {

                 if (coord1 == coord2 && r == r2) //두 원 동일

                         cout << -1 << endl;

                 else if (distance + shortR < longR) //접점이 없는 경우

                         cout << 0 << endl;

                 else if (distance + shortR == longR) //하나의 접점

                         cout << 1 << endl;

                 else if (distance + shortR > longR) //두 개의 점점

                         cout << 2 << endl;

        }

        else

        {

                 if (distance > longR + shortR) //접점이 없는 경우

                         cout << 0 << endl;

                 else if (distance == longR + shortR) //한개의 접점

                         cout << 1 << endl;

                 else if (distance < longR + shortR) //두개의 접점

                         cout << 2 << endl;

        }

}

 

int main(void)

{

        int test_case;

        cin >> test_case;

 

        for (int i = 0; i < test_case; i++)

        {

                 cin >> x >> y >> r >> x2 >> y2 >> r2;

                 coord1 = make_pair(x, y); //규현

                 coord2 = make_pair(x2, y2); //승환

 

                 printContactNum();

        }

        return 0;

}



개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


*Visual Studio 2017에서 변수명을 y1으로 쓰면 C2365 에러가 뜹니다. 이유를 모르겠습니다...

*cmath 헤더파일에 y1 함수가 존재하기 때문에 C2365 에러가 뜨는거였습니다.

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1037번 약수  (2) 2018.05.04
백준 1004번 어린 왕자  (0) 2018.05.01
백준 14926번 Not Equal  (0) 2018.05.01
백준 1085번 직사각형에서 탈출  (0) 2018.04.30
백준 2178번 미로 탐색  (2) 2018.04.29