안녕하세요.

여행벌입니다.


https://www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

[알고리즘설계]

점과 거리가 주어지면 우리는 원을 2개 그릴 수 있고, 두 개의 원 둘레 위에 류재명이 있을 수 있으므로,

두 원의 관계에 따라 정답을 출력하면 된다.

#include<iostream>

int main(void) {
	int test_case;
	std::cin >> test_case;
	while (test_case) {
		int x1, y1, r1, x2, y2, r2;
		std::cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		//두 원이 같은 경우
		if (x1 == x2 && y1 == y2 && r1 == r2)
			std::cout << -1 << '\n';
		//두 원이 중심은 같으나 반지름이 다른 경우
		else if (x1 == x2 && y1 == y2 && r1 != r2)
			std::cout << 0 << '\n';
		//두 원이 외접
		else if (((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) == ((r1 + r2) * (r1 + r2)))
			std::cout << 1 << '\n';
		//두 원이 내접
		else if (((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) == ((r1 - r2) * (r1 - r2)))
			std::cout << 1 << '\n';
		//두 점에서 만날 경우
		else if (((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) < ((r1 + r2) * (r1 + r2)) && ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) > ((r1 - r2) * (r1 - r2)))
			std::cout << 2 << '\n';
		else
			std::cout << 0 << '\n';
		/*
		//두 원이 바깥에서 안 만날 경우
		else if (((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) > ((r1 + r2) * (r1 + r2)))
			std::cout << 0 << '\n';
		else //if (((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) < ((r1 - r2) * (r1 - r2)))
			std::cout << 0 << '\n';*/
		test_case--;
	}
}

열심히 공부하고 노력하고 있는 꿈 많은 예비 개발자입니다.

혼자서 공부한 내용을 정리하고 포스팅하다 보니 틀린 내용이 있을 수도 있습니다.

많은 조언과 가르침 주실 분은 댓글로 자유롭게 남겨주셔도 좋을 것 같습니다! 

감사합니다.

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 1012 - 유기농 배추  (0) 2019.08.21
[BOJ] 1009 - 분산처리  (0) 2019.08.21
[BOJ] 17174 - 전체 계산 횟수  (0) 2019.08.21
[BOJ] 1101 - Fly me to the Alpha Centauri  (0) 2019.08.21
[BOJ] 1436 - 영화감독 숌  (0) 2019.08.21

+ Recent posts