본문 바로가기

코드포스

[코드포스 Practice15] E. Crazy Town

 

E번 혼자서는 못 풀었을 문제였음ㅋㅋㅋ

아이디어 쓰는 문제였는데 풀이가 진짜 신기하다. 

 

이 문제는 점 A에서 B로 갈 때 몇 개의 직선을 건너냐는 문제다. 

나는 이걸 막 교점을 구해서 그 교점과 A를 비교한 다음 하나씩 계산해야겠다고 생각했는데 더 쉽고 빠른 방법이 있었음.

직선을 건너는 경우를 생각해보면 어느 한 점은 직선 위에, 한 점은 직선 아래에 있어야 한다. 그래서 직선을 기준으로 점이 위, 아래에 있는지 계산한 다음 서로 다른 위치에 있는 경우 개수를 센다. 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
 
int main() {
    vector<int> home(2);
    vector<int> univ(2);
    
    scanf("%d %d", &home[0], &home[1]);
    scanf("%d %d", &univ[0], &univ[1]);
    
    int n, count = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        i64 a, b, c;
        scanf("%lld %lld %lld", &a, &b, &c);
        
        i64 res1 = a*home[0] + b*home[1] + c;
        i64 res2 = a*univ[0] + b*univ[1] + c;
        
        if (res1 < 0ll && 0ll < res2)
            count++;
        else if (res2 < 0ll && 0ll < res1)
            count++;
    }
    printf("%d", count);
    
    return 0;
}

 

와... 아이디어가 다했다. 

 

근데 두 번이나 틀렸다ㅋㅋㅋ

두 위치가 같은 곳에 있는지 다른 곳에 있는지 파악하려면 식에 점 위치를 넣어서 부호가 같아야 한다. 

나름 깔쌈하게 하려고 두 수를 곱해서 양수라면 패스, 음수라면 count 하려 했는데 오버플로우 나서.. 틀렸음.

 

그래서 그냥 따로 비교했다. 

 

예헤이~