반응형

문제 링크

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

 

풀이 )

  각 행성계에 대해서 출발점과 도착점이 행성계 내부에 있는지 외부에 있는지 확인한다.

  출발점, 도착점 각각에 대해서 모두 행성계 내부에 있거나 외부에 있는 경우 진입이나 이탈을 할 필요가 없으므로

  • 출발점 - 내부, 도착점 - 외부
  • 출발점 - 외부, 도착점 - 내부

  두 경우에만 집입/이탈의 횟수를 늘려간다.

 

#include <iostream>

using namespace std;

int main(void){
    int t;
    cin >> t;
    while(t--){
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        int n;
        cin >> n;
        int ans = 0;
        while(n--){
            int x, y, r;
            cin >> x >> y >> r;
            bool in1, in2;
            in1 = (x1-x)*(x1-x)+(y1-y)*(y1-y) < r*r;
            in2 = (x2-x)*(x2-x)+(y2-y)*(y2-y) < r*r;
            if(in1 != in2)
                ans++;
        }
        cout << ans << endl;
    }
}
반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 5430 : AC  (0) 2020.11.30
[C++] 백준 - 17300 : 패턴  (0) 2020.11.29
[C++] 백준 - 1002 : 터렛  (0) 2020.11.29
[C++] 백준 - 14891 : 톱니바퀴  (0) 2020.11.27
[C++] 백준 - 14888 : 연산자 끼워넣기  (0) 2020.11.25
반응형

문제 링크

 

1002번: 터렛

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

www.acmicpc.net

 

풀이 )

  두 원 사이의 거리를 이용하는 문제이다.

  두 원의 위치 관계는 다음과 같이 나눌 수 있다. (d^2 = (x2-x1)^2 + (y2-y1)^2)

  • 일치 --- 1 (d == 0 && r1 == r2)
  • 서로 다른 두 점에서 만나는 경우 --- 2 (|r2-r1| < d < r2+r1)
  • 한 점에서 만나는 경우
    • 내접 --- 3 (d == |r2-r1|)
    • 외접 --- 4 (d == r2+r1)
  • 만나지 않는 경우
    • 내부에 있는 경우 --- 5 (d < |r2-r1|)
    • 외부에 있는 경우 --- 6 (d > r2+r1)

 

 

#include <iostream>

using namespace std;

int main(void){
    int t;
    cin >> t;
    while(t--){
        int x1, y1, r1, x2, y2, r2;
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
        int dd = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
        if(dd == 0){
            if(r1 == r2)	// case 1
                cout << "-1" << endl;
            else			// case 5
                cout << '0' << endl;
            continue;
        }
        if(dd > (r1+r2)*(r1+r2) || dd < (r1-r2)*(r1-r2))	// case 6, 5
            cout << '0' << endl;
        else if(dd == (r1+r2)*(r1+r2) || dd == (r1-r2)*(r1-r2))	// case 4, 3
            cout << '1' << endl;
        else	// case 2
            cout << '2' << endl;
    }
}
반응형

+ Recent posts