본문 바로가기
[백준]

[BaekJoon/백준] 1002번

by Hevton 2020. 8. 25.
반응형

오늘은 1000, 1001, 1002 세문제만 풀고 기록하고 자려고 1002번 문제를 켰는데, 정답률이 20퍼센트..? 인걸 보고 쉬운 문제가 아니겠다 라고 생각했습니다. 문제를 쭉쭉 읽어나가는데, 정말 이전 문제들에 비해서 난이도가 굉장히 올라간 듯 보였습니다. 1000, 1001이랑은 비교할 수 없을 정도더라구요.

 

해당 문제를 잘 풀어읽어보면, 두 원의 접점의 수를 구하라는 문제인 것을 알 수 있습니다. 두 원의 위치관계는 6가지.


1 - 두 점에서 만난다.
2, 3 - 한 점에서 만난다 (내접, 외접)
4 - 두 원이 만나지 않는다.
5, 6 - 동심원 (두 원이 외부, 내부 관계)

 

해당하는 경우에 따라서 코딩해 주면 됩니다.

 

import java.util.Scanner;

public class main {
    public static void main(String args[]) {
        int x1, y1, r1, x2, y2, r2, r, test_case;
        double d;
        Scanner scanner = new Scanner(System.in);
        test_case = scanner.nextInt();
        for (int i = 0; i < test_case; i++) {
            x1 = scanner.nextInt();
            y1 = scanner.nextInt();
            r1 = scanner.nextInt();

            x2 = scanner.nextInt();
            y2 = scanner.nextInt();
            r2 = scanner.nextInt();

            r = r1 + r2;
            d = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2)); // x1 y1과 x2 y2 사이의 거리

            if ((x1 == x2) && (y1 == y2)) // 두 좌표가 같은 경우 ( 동심원 ) < 5, 6 >
            {
                if (r1 == r2) // 두 원이 겹침
                    System.out.println(-1);
                else // 동심원인데 안겹침
                    System.out.println(0);
            }
            else if (r < d) // 두 원의 교점이 없을 때, 두 원이 닿지 않음. < 4 >
                System.out.println(0);
            else if (r == d) // 외접 < 3 >
                System.out.println(1);
            else if (r > d) {
                if (r1 <= r2) {
                    if (r2 - r1 == d) //내접 < 2 >
                        System.out.println(1);
                    else if (r2 - r1 > d) // 안만남 < 5 >
                        System.out.println(0);
                    else if (r2 - r1 < d) // 두 원이 두 점에서 만남. < 1 >
                        System.out.println(2);
                } else {
                    if (r1 - r2 == d) //내접 < 2 >
                        System.out.println(1);
                    else if (r1 - r2 > d) //안만남 < 5 >
                        System.out.println(0);
                    else if (r1 - r2 < d) // 두 원이 두 점에서 만남. < 1 >
                        System.out.println(2);
                }
            }
        }
        scanner.close();
    }
}

 

'문제 풀기' 자체만이 아니라 '나의 코딩에 대해서'도 전반적으로 생각해보며 문제를 풀면서, 많은 것을 느꼈습니다.

 

8년동안 야매로 코딩해온 탓에 코드를 정리정돈 하지 못한다는 것을 느꼈고,
다른 사람들의 코드 용량이 나보다 훨씬 적은 것을 보고 아직 정말 진짜 코딩적으로 멀었구나 라는 생각을 했습니다. 더욱이 스스로도 코딩하면서 쓸데없는 코딩도 많음을 느꼈고, 지저분하다는 생각도 그리고 체계적이지 못하다는 생각도 많이 했습니다.

 

앞으로 자료구조 알고리즘 공부도 해야겠고, 더욱이 코드를 최대한 간결하고 깔끔하게 짜려고 노력해야겠습니다.

 

반응형

'[백준]' 카테고리의 다른 글

[BaekJoon/백준] 1단계 "입출력과 사칙연산"  (0) 2020.08.28
[BaekJoon/백준] 1003번 | 복습 1회 완료  (0) 2020.08.27
[BaekJoon/백준] 1001번  (0) 2020.08.25
[BaekJoon/백준] 1000번  (0) 2020.08.25
백준(Baekjoon) 회원가입  (0) 2020.08.25