중심의 좌표가 (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 |
두 원이 완전히 일치하는 경우,
두 원이 멀어서 접하지 않는 경우,
한 원의 내부에서 접하지 않는 경우,
내접하는 경우,
외접하는 경우,
겹쳐서 두 점이 만나는 경우
이렇게 여섯가지 경우로 나눠서 풀었다.
알고리즘 초보라서 성능 개선을 위해 이것저것 시도해봤는데 이 이상 안줄어든다.
'발전 > JAVA' 카테고리의 다른 글
[백준] 1049 기타줄 JAVA 자바 해설 및 정답코드 (0) | 2022.04.07 |
---|---|
[백준] 1292번 쉽게 푸는 문제 자바(JAVA) (0) | 2022.04.06 |
[백준]1010번 다리놓기 풀이 코드/입출력 방식에 따른 성능 개선 (0) | 2022.01.31 |
[java] BigInteger (java.math) - 백준 1271번, 2338번 (0) | 2021.09.11 |
[Java] 큰 따옴표(" ")와 작은 따옴표(' ') 차이 (1) | 2021.07.14 |