[BOJ] 수학 2(2)

2020. 7. 25. 21:21BOJ

토요일 저녁이라 역시 뭐를 하기가 귀찮군요 허허.

 

[BOJ 1085]

 

직사각형의 벽까지의 거리의 최솟값을 구해주면 됩니다. min을 3번 쓰면 됩니다. min은 algorithm 헤더에 구현되어 있습니다.

#include <stdio.h>
#include <algorithm>

using namespace std;

int distoutside(int x, int y, int w, int h){
    return min(min(x, w-x), min(y, h-y));
}

int main(){
    int x, y, w, h;
    scanf("%d%d%d%d",&x,&y,&w,&h);
    printf("%d",distoutside(x,y,w,h));
}

 

[BOJ 3009]

 

사각형에서 가로나 세로로 이웃한 점들은 그 줄의 좌표를 공유합니다. 좌표가 3개 주어지므로 x좌표 중 2개는 똑같고 나머지 하나가 원하는 값입니다. y좌표도 똑같습니다. 이때, 값이 int로 주어지기 때문에 xor 기법을 사용하면 아주 쉽게 구현할 수 있습니다.

#include <stdio.h>
#include <vector>

using namespace std;

typedef pair<int,int> point_t;

point_t rectpoint(const vector<point_t> & points){
    int x = 0, y = 0;
    for(point_t p : points){
        x ^= p.first;
        y ^= p.second;
    }
    return {x, y};
}

int main(){
    vector<point_t> points(3);
    for(int k=0;k<3;++k)
        scanf("%d%d", &points[k].first, &points[k].second);
    point_t res;
    res = rectpoint(points);
    printf("%d %d", res.first, res.second);
}

 

[BOJ 4153]

 

피타고라스의 정리를 써서 확인하면 됩니다. 가장 긴 변의 길이의 제곱을 구한 다음에 나머지 값의 제곱합과 같은지 비교하면 됩니다. double로 바꿔서 루트를 구해서 할 수도 있지만 정확하게 값이 같은지 비교하기 위해 제곱된 상태의 int로 비교해주는 것을 권장드립니다.

#include <stdio.h>
#include <algorithm>

using namespace std;

bool isperpendicular(int a, int b, int c){
    if(a>b) swap(a, b);
    if(b>c) swap(b, c);
    return (a*a + b*b == c*c);
}

int main(){
    while(true){
        int A, B, C;
        scanf("%d%d%d",&A,&B,&C);
        if(A == 0 && B == 0 && C == 0) break;
        printf("%s\n", isperpendicular(A, B, C) ? "right" : "wrong");
    }
}

 

[BOJ 3053]

 

원의 넓이 공식을 구현해주면 되겠습니다. 택시 기하학의 경우는 원이 유클리드 공간의 정사각형의 모양과 같아집니다. 이때 정사각형의 대각선의 길이가 주어지는 상황이 되겠습니다. 잘 구해주면 됩니다.

#include <stdio.h>
#include <math.h>

double area_circle(double r){
    return M_PI * r * r;
}

double area_circle_taxi(double r){
    return r * r * 2;
}

int main(){
    double R;
    scanf("%lf",&R);
    printf("%.4f\n%.4f\n", area_circle(R), area_circle_taxi(R));
}

 

[BOJ 1002]

 

좌표가 다른 위치에 주어진다는 조건이 없습니다. 좌표가 같은 경우에는 반지름이 같으면 경우의 수가 무한개가 됩니다. 그렇지 않으면 불가능합니다. 좌표가 다른 경우에는 좌표 간 거리와 반지름들을 가지고 삼각형이 잘 형성되는지 아닌지를 보면 됩니다. 삼각형이 형성되면 답은 2개입니다. 일직선이면 1개입니다. 그렇지 않으면 불가능합니다. 이때, 삼각형이 형성되는지 보기 위해 합과 차를 둘 다 검사해야 합니다. 저는 부분에서 한번 틀렸습니다.

#include <stdio.h>
#include <math.h>

static inline int square(int x){
    return x * x;
}

int countpossibility(int x1, int y1, int r1, int x2, int y2, int r2){
    if(x1 == x2 && y1 == y2){
        if(r1 != r2) return 0;
        else return -1;
    } else{
        int rsumsq = square(r1 + r2);
        int distsq = square(x1 - x2) + square(y1 - y2);
        if(rsumsq < distsq) return 0;
        else if(rsumsq == distsq) return 1;
        
        int rdiffsq = square(r1 - r2);
        if(rdiffsq < distsq) return 2;
        else if(rdiffsq == distsq) return 1;
        else return 0;
    }
}

int main(){
    int T;
    scanf("%d",&T);
    for(int k=0;k<T;++k){
        int x1, y1, r1, x2, y2, r2;
        scanf("%d%d%d%d%d%d", &x1, &y1, &r1, &x2, &y2, &r2);
        printf("%d\n", countpossibility(x1, y1, r1, x2, y2, r2));
    }
}

 

수고하셨습니다.

'BOJ' 카테고리의 다른 글

[BOJ] 재귀  (0) 2020.07.29
[BOJ 19533] [UCPC 2020 예선] 길이 문자열  (0) 2020.07.28
[BOJ] 수학 2(1)  (0) 2020.07.25
[BOJ] 수학 1(2)  (0) 2020.07.24
[BOJ] 수학 1(1)  (0) 2020.07.24