본문 바로가기

백준/백준

[ 백준 1002 ] 터렛

1. 문제 링크 https://www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

2. 문제

3. 문제 요약

 O1 := (x1, y1)을 중심으로 반지름이 r1인 원

 O2 := (x2, y2)을 중심으로 반지름이 r2인 원

 이 때, O1과 O2의 가능한 교점의 수 구하기

 

4. 문제 풀이

 두 원의 교점이 있는지와 관련한 문제이다.

 두 원이 접하는 지에 대해서 가능한 경우를 생각해보면, 총 6가지 경우를 생각해보면 된다.

 (1)교점이 무수히 많은 경우
 (2)교점이 2개 생기는 경우  

 (3)교점이 1개 생기는 경우

    (3-1) 교점이 외접하는 경우
    (3-2) 교점이 내접하는 경우
 (4)교점이 없는 경우
    (4-1) 두 원이 겹치지 않는 경우
    (4-2) 두 원이 겹치는 경우 

 

이 문제의 특징으로는, 교점들의 정확한 좌표를 구하는 것이 아니기 때문에

거리를 비교하는 과정에서, 제곱값을 그대로 활용한다는 점이 특징이라 할 수 있다.

 

5. 문제 코드 ( Java )

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int boj1002() throws Exception {
    StringTokenizer str = new StringTokenizer(bfr.readLine());
    int x1 = Integer.parseInt(str.nextToken());
    int y1 = Integer.parseInt(str.nextToken());
    int r1 = Integer.parseInt(str.nextToken());
    int x2 = Integer.parseInt(str.nextToken());
    int y2 = Integer.parseInt(str.nextToken());
    int r2 = Integer.parseInt(str.nextToken());
 
    int d = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
    int sum = (r1+r2) * (r1+r2);
    int dif = (r1-r2) * (r1-r2);
 
    if( d >= sum ) return d>sum ? 0 : 1;
    if( d == dif ) return d==0 ? -1 : 1;
    else return d < dif ? 0 : 2;
}
Colored by Color Scripter
 

 

'백준 > 백준' 카테고리의 다른 글

[ 백준 1978 ] 소수 찾기  (0) 2019.11.03
[ 백준 9465 ] 스티커  (0) 2019.11.02
[백준 1780] 종이의 개수  (0) 2019.02.09
[백준 1992] 쿼드트리  (0) 2019.02.08
[백준 2167 ] 2차원 배열의 합  (0) 2019.02.07