본문 바로가기
개인 공부/코딩테스트

[C++] 백준 1002번 터렛 :: seoftware

by seowit 2020. 3. 6.

문제

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

 

1002번: 터렛

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

www.acmicpc.net

소스코드

 

#include <iostream>
#include <cmath>
using namespace std;

int main(void) {
	int T; cin >> T;
	for (int t = 0; t < T; t++) {
		int x1, y1, r1, x2, y2, r2;
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;

		int answer;
		//원의 중심간의 거리
		float d = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
		//case 1 : 내접
		if (d == abs(r1 - r2) && d != 0) answer = 1;
		//case 2 : 외접
		else if (d == r1 + r2) answer = 1;
		//case 3 : 한 원이 다른 원을 포함
		else if (d < abs(r1 - r2)) answer = 0;
		//case 4 : 두 점에서 만나는 경우
		else if (d < r1 + r2 && d > abs(r1-r2)) answer = 2;
		//case 5 : 만나지 않는 경우
		else if (d > r1 + r2) answer = 0;
		//case 6 : 두 원이 일치하는 경우
		else if (d == 0 && r1 == r2) answer = -1;

		cout << answer << endl;
	}
}

 

코드설명

중학교 수학 시간에 배웠던 두 원의 위치 관계에 대한 문제였다. 

d에 점 (x1, y1)과 점 (x2, y2) 간의 거리를 저장하고 d와 반지름 간의 관계로 케이스 분류해서 푸는 문제!

댓글