본문 바로가기
발전/JAVA

[백준] 1002 터렛 풀이, 정답코드, 채점결과

by babepro 2022. 1. 31.

중심의 좌표가 (x1, y1), 반지름이 r1인 원과 중심의 좌표가 (x2, y2), 반지름이 r2인 원의 접점의 개수를 구하는 문제이다. 

 

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        
        while(T-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            
            int x1 = Integer.parseInt(st.nextToken());
            int y1 = Integer.parseInt(st.nextToken());
            int r1 = Integer.parseInt(st.nextToken());
            int x2 = Integer.parseInt(st.nextToken());
            int y2 = Integer.parseInt(st.nextToken());
            int r2 = Integer.parseInt(st.nextToken());
 
            sb.append(tangentPoint(x1, y1, r1, x2, y2, r2)).append('\n');
        }
        System.out.println(sb);
    }
    
    private static Object tangentPoint(int x1, int y1, int r1, int x2, int y2, int r2) {
        int distancePow = (int)(Math.pow(x2-x1, 2+ Math.pow(y2-y1, 2));
        
        if(x1==x2 && y1==y2 && r1==r2) {
            return -1;
        } else if(distancePow > Math.pow(r1 + r2, 2)) {
            return 0;
        } else if(distancePow < Math.pow(r2 - r1, 2)) {
            return 0;
        } else if(distancePow == Math.pow(r2-r1, 2)) {
            return 1;
        } else if(distancePow == Math.pow(r1+r2, 2)) {
            return 1;
        } else return 2;
    }
}
cs

두 원이 완전히 일치하는 경우, 

두 원이 멀어서 접하지 않는 경우, 

한 원의 내부에서 접하지 않는 경우, 

내접하는 경우, 

외접하는 경우, 

겹쳐서 두 점이 만나는 경우

 

이렇게 여섯가지 경우로 나눠서 풀었다. 

 

알고리즘 초보라서 성능 개선을 위해 이것저것 시도해봤는데 이 이상 안줄어든다.