본문 바로가기
문제 풀이/백준(BOJ)

[C] 백준 1002번 : 터렛

by 희조당 2021. 3. 23.
728x90

www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net


문제 접근

 1. 반복 횟수와 x1,x2,y1,y2,r1,r2를 받는다.

 2. 교차 점이 두개인 경우 중심 사이 거리가 두 반지름의 합보다 작고 중심 사이 거리가 두 반지름의 차보다 크다.

 3. 한개인 경우 중심 사이의 거리와 두 반지름의 합이 같거나(외접) 중심 사이의 거리와 두 반지름의 차와 같다(내접).

 4. 중심점이 같고 반지름이 같으면 무수히 많고, 중심점이 같은데 반지름이 다르면 아예 없다.

느낀점

되게 쉽네 하면서 풀었지만 내접의 경우를 생각하지 못하고 중심점 사이 거리와 두 반지름의 차를 비교할 생각을 못해서 틀렸다. 요즘 자바를 배우고 있어서 자바를 연습할 겸 또 코딩을 하는데 선언이 조금 다른 부분이 있어서 공부하는 계기가 되었다.

코드

#include <stdio.h>
#include <math.h>

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		int x1, y1, r1, x2, y2, r2;
		scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2);
		double distance = sqrt((pow(x2 - x1, 2) + pow(y2 - y1, 2)));
		int sub = r1 > r2 ? r1 - r2 : r2 - r1;
		if (distance == 0 && r1 == r2) printf("-1\n");
		else if (distance < r1 + r2 && distance > sub) printf("2\n");
		else if (distance == r1 + r2 || distance == sub) printf("1\n");
		else printf("0\n");
	}

	return 0;
}
import java.util.Scanner;

public class test {
	public static void main(String[] arg) {
		Scanner sc = new Scanner(System.in);
		int T;
		T = sc.nextInt();
		for (int i = 0 ; i<T;i++) {
			int x[] = new int[3];
			int y[] = new int[3];
			int r[] = new int[3];
			for(int j = 0; j<2;j++) {
				x[j] = sc.nextInt();
				y[j] = sc.nextInt();
				r[j] = sc.nextInt();
			}
			double distance = Math.sqrt(Math.pow(x[1]-x[0], 2)+Math.pow(y[1]-y[0], 2));
			int sub = Math.abs(r[0]-r[1]);
			int sum = r[0]+r[1];
			
			if(distance == 0 && sub == 0) System.out.println(-1);
			else if(distance == sum || distance == sub) System.out.println(1);
			else if(distance < r1+r2 && distance > sub) System.out.println(2);
			else System.out.println(0);
		}
	}
}

댓글