[BOJ 1002 / C++] 터렛

황준하·2022년 3월 13일
0

문제 링크

  • 문제의 자세한 사항은 위의 링크를 참고해주세요.

해결 방안

  • 각 좌표를 중심으로 하는 원을 그린다고 생각하자.

    • 그렇다면, 두 좌표에 대한 두 개의 원이 만들어진다.
  • 왜 원이 그려지나??

    • 한 좌표에 대해 류제명 사이의 거리를 알려준다.
    • 그렇다면 그 좌표를 중심으로 류제명 사이의 거리가 성립하는 모든 좌표를 그리면 원이 되는 것을 알 수 있다.
  • 만들어진 두 원의 위치에 대한 경우의 수를 고려해준다.

    • 외접
    • 내접
    • 동심원 (완전히 겹치는 경우와 그렇지 않은 경우)
    • 한 원이 다른 원 안에 있고 만나지 않을 때
    • 두 원이 서로 만나지 않을 때 (떨어져 있을 때)

코드

#include <iostream>
#include <cmath>  // pow 함수를 사용하기 위해 선언

using namespace std;

int main() {
	int T;
	int arr[10] = { 0, };
	cin >> T;

	for (int i = 0; i < T; i++) {
		for (int j = 0; j < 6; j++) {
			cin >> arr[j];
		}
		int jo = pow(arr[0] - arr[3], 2) + pow(arr[1] - arr[4], 2);  // 두 좌표 사이의 거리

		if (arr[0] == arr[3] && arr[1] == arr[4]) {  // 두 좌표가 같고 (동심원)
			if (arr[2] == arr[5])  // 각 좌표와 류재명 사이의 거리가 같으면 ==> 원이 그려지는 모든 좌표에 류제명이 있을 수 있다.
				cout << -1 << endl; 
			else // 류재명과 각 좌표 사이의 거리가 다르면   ==> 겹치지 않는다.
				cout << 0 << endl;
		}
		else if (jo == pow(arr[2] + arr[5],2))  // 외접 ==> 두 좌표의 거리 == 각 원의 반지름을 더한 값
			cout << 1 << endl;
		else if (jo < pow(arr[2] + arr[5],2) && jo> pow(arr[2] - arr[5], 2))  // 교접 ==> 원의 위치가 외접 ~ 내접 사이에 있어야 함.
			cout << 2 << endl;
		else if(jo == pow(arr[2] - arr[5],2)) // 내접 ==> 두 좌표의 거리 == 각 원의 반지름을 뺀 값
			cout << 1 << endl;
		else // 한 원이 다른 원의 내부에 있고 만나지 않을 때, 두 원이 만나지 않을 때(떨어져 있을 때)
			cout << 0 << endl;  // 즉, pow(arr[2] - arr[5],2) > jo , pow(arr[2] + arr[5],2) < jo
	}

	return 0;
}

반성

  • 케이스에 대해 총 6개의 값을 받는다.

    • 이 부분을 서로 다른 이름의 변수로 받는 것이 더 편할 것 같다.
    • 배열로 받다보니 index값으로 계산을 해야했고 헷갈렸다...
  • 두 원이 교접할 때

    • 처음에 jo < pow(arr[2] + arr[5],2) 만 고려를 해줘서 틀렸습니다를 연발했다.
    • 내접과 외접의 위치 사이가 교접으로 쉽게 생각하면 되는데...
    • 지금와서는 왜 이렇게 쉬운 걸 생각 못했지?라는 생각을 하지만 처음에 계속 생각해도 답이 안나오는게 신기하기도 하고....ㅠㅠ

0개의 댓글