[BaekJoon/백준] 1004번

Hevton·2020년 8월 28일
0

수학의 수 자도 싫어하는 나는 1004번을 열자마자 속이 메스꺼웠다.
대충 문제를 읽어보면, 출발점에서 도착점까지 행성들을 최소한으로 통과하는 선에서 이동할 건데 그 최소한의 통과 횟수를 구하란다.
처음 문제를 접하면 "이걸 어떻게 풀어" 라는 생각을 할 수 있다. 나는 수학의 수 자도 싫어하기 때문에, 이건 문제의 직관적인 해석으로는 절대 풀어나갈 수 없겠다고 직감이 왔다. 그리고 분명 다른 해석이 가능할 것이라고 생각했다. ※ 그리고 '문제'와 '결과' 의 연관성에 대한 다른 접근의 경우의 수들을 생각해보다가 곧이어 방법을 찾을 수 있었다.

이 문제는 "출발점 또는 도착점의 좌표를 품고 있는 원을 찾아라" 라고 다르게 생각해 볼 수 있다. 물론 이 때, 한 가지 예외의 경우가 생긴다. 바로 '원 안에 출발점과 도착점의 좌표가 모두 있는 경우'. 이 경우는 문제에서 행성을 통과하는 경우에 해당하지 않으므로 반드시 제외해줘야한다.

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        
        Scanner scanner = new Scanner(System.in);

        int T = 0, n = 0, count = 0, start_x, start_y, end_x, end_y, a, b, r;

        T = scanner.nextInt();

        for(int i = 0; i < T; i++)
        {
            start_x = scanner.nextInt();
            start_y = scanner.nextInt();
            end_x = scanner.nextInt();
            end_y = scanner.nextInt();

            n = scanner.nextInt();

            for(int j = 0; j < n; j++)
            {
                a = scanner.nextInt();
                b = scanner.nextInt();
                r = scanner.nextInt();
                if(is_in(start_x, start_y, a, b, r)&&is_in(end_x, end_y, a, b, r))
                    continue;
                if(is_in(start_x, start_y, a, b, r))
                    count++;
                if(is_in(end_x, end_y, a, b, r))
                    count++;
            }
            System.out.println(count);
            count = 0;
        }
    }

    public static boolean is_in(int x, int y, int r_x, int r_y, int r_r)
    {
        return Math.pow(x-r_x, 2)+Math.pow(y-r_y, 2)<Math.pow(r_r, 2);
    }
}

이 방법만 생각해 낸다면, 코딩은 쉽게 끝낼 수 있다.

profile
놀만큼 놀았다.

0개의 댓글