공부/백준(C++) - 2022~

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

상연 2022. 1. 22. 02:03

목차

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

     

    1002번: 터렛

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

    www.acmicpc.net

    코드

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    class turret
    {
    	public :
    		double x;
    		double y;
    		double r;
    	
    	turret(double _x, double _y, double _r)
    	{
    		x = _x;
    		y = _y;
    		r = _r;
    	}
    	
    	void change_value(double _x, double _y, double _r)
    	{
    		x = _x;
    		y = _y;
    		r = _r;
    	}
    	
    };
    
    double cal_distance(turret t1, turret t2)
    {
    	return sqrt(pow(abs(t2.x - t1.x), 2) + pow(abs(t2.y - t1.y), 2)); 
    }
    
    bool isSame(turret t1, turret t2)
    {
    	if(t1.x == t2.x && t1.y == t2.y && t1.r == t2.r)
    	{
    		return true;	
    	}
    	else
    	{
    		return false;
    	}
    }
    
    int main() {
    	int t;
    	cin >> t;
    	double x1, x2, y1, y2, r1, r2, dis, sum_r, sub_r;
    	turret big_circle = turret(0, 0, 0);
    	turret small_circle = turret(0, 0, 0);
    	
    	
    	for(int i=0; i<t; i++)
    	{
    		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
    		if(r1 > r2)
    		{
    			big_circle.change_value(x1, y1, r1);
    			small_circle.change_value(x2, y2, r2);
    		}
    		else
    		{
    			big_circle.change_value(x2, y2, r2);
    			small_circle.change_value(x1, y1, r1);
    		}
    		
    		dis = cal_distance(big_circle, small_circle);
    		sum_r = big_circle.r + small_circle.r;
    		sub_r = big_circle.r - small_circle.r;
    		
    		if(isSame(big_circle, small_circle))
    		{
    			cout << -1 << endl;
    		}
    		else
    		{
    			if(sum_r < dis || sub_r > dis) // 0개
    			{
    				cout << 0 << endl;
    			}
    			else if(sum_r == dis || sub_r == dis)
    			{
    				cout << 1 << endl;
    			}
    			else if(sum_r > dis || sub_r < dis)
    			{
    				cout << 2 << endl;
    			}
    			
    		}
    	}
    	
    	
    	return 0;
    }

    굳이 클래스를 쓸 필요는 없는데, 그냥 한 번 써보고 싶어서 써봤다.

    https://wonsang98.tistory.com/16

     

    1002번: 터렛(백준 C++, 추가 테스트 케이스)

    1002번: 터렛 링크 코드 #include #include using namespace std; int distance(int x1, int y1, int x2, int y2){ return ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } int main() { int t; // test cas..

    wonsang98.tistory.com

    풀이의 해설의 경우는 이전에 쓴 글과 접근방법이 거의 비슷해서 위의 글을 참고하는편이 좋을것같다.

    대략 케이스가 7가지 있다는것을 알고 풀면 되는 문제이다.