🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/BOJ

[백준 / 1002번] 터렛 - (Java - 수학)

JONG_UK 2022. 12. 22. 22:03
728x90
반응형
SMALL

 

1002번: 터렛

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

www.acmicpc.net


💬 문제 접근

  • 2번 테스트케이스를 가지고 좌표체계를 한번 그려본다. 그리게 되면 두 원이 생긴다는 것을 알 수 있다.
  • 피타고라스 식을 사용해 두 원의 중심점을 기준으로 원의 접점이 얼마나 생기는지 생각해보며 계산하면 된다.

💡 문제 풀이

int between_distance = (int)Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
  • 피타고라스 식을 사용하여 두 점간의 거리를 구해준다.
  • double형을 사용해줘도 되지만 그냥 int형으로 형변환을 해줬다.

 

  • 위 사진을 참고하여 1~5번까지의 경우와 그리고 두 원이 겹치는 경우를 포함해 총 6가지의 경우를 생각해보고 풀면 된다.

⭐️ 코드

import java.util.Scanner;

public class BJ_CT_2 {

    public static void main(String[] args) {
        BJ_CT_2 sol = new BJ_CT_2();
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int testcase = 0; testcase < T; testcase++) {
            // 0 0 13 40 0 37
            int x1 = sc.nextInt();
            int y1 = sc.nextInt();
            int r1 = sc.nextInt();

            int x2 = sc.nextInt();
            int y2 = sc.nextInt();
            int r2 = sc.nextInt();
            System.out.println(sol.solution(x1, y1, r1, x2, y2, r2));
        }
    }

    public int solution(int x1, int y1, int r1, int x2, int y2, int r2) {
        // 조규현의 좌표 (x1, y1) , 백승환의 좌표 (x2, y2)
        // -> (0,0) : 13 / (40,0) : 37
        // 조규현이 계산한 류재명과의 거리 r1 -> 13
        // 백승현이 계산한 류재명과의 거리 r2 -> 37
        int between_distance = (int)Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));

        // 중심점이 같고 반지름이 같은 경우
        if (x1 == x2 && y1 == y2 && r1 == r2) {
            return -1;
        }
        // 중심점간의 거리가 두 원의 반지름 길이의 합보다 클 때
        else if (between_distance > Math.pow(r1 + r2, 2)) {
            return 0;
        }
        // 두 원 중 하나가 작고 원 안에서 내접하지 않을 때
        else if (between_distance < Math.pow(r1 - r2,2)) {
            return 0;
        }
        // 두 원이 외접할 때
        else if (between_distance == Math.pow(r1 + r2, 2)) {
            return 1;
        }
        // 두 원이 내접할 때
        else if (between_distance == Math.pow(r1 - r2, 2)) {
            return 1;
        }
        // 중심점간의 거리가 두 원의 반지름 길이의 합보다 작을 때 2개의 접점 생김
        else {
            return 2;
        }
    }
}


👀 후기

  • 수학적 지식을 사용해 풀기에는 아직 많이 어렵다...
  • 막상 알고 나면 쉽지만 항상 생각하기까지의 시간이 많이 걸린다.
  • 화이팅이닷!

 

728x90
반응형
LIST