[BOJ] 기하 1 (1)

Wonjun·2022년 9월 2일
0

BOJ

목록 보기
11/16
post-thumbnail

📝1085번: 직사각형에서 탈출

문제 설명

직사각형에서 탈출

해결 방법

w - x, h - y 중에 더 작은 값을 a라 하고 x, y중에 더 작은 값을 b라 하면 a와 b 중 더 작은 값이 최소거리이다.

💻소스코드

#include <iostream>
#include <algorithm>

using namespace std;

int main(void)
{
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int x, y, w, h;
    int a, b;

    cin >> x >> y >> w >> h;
    a = min(w - x, h - y);
    b = min(x, y);
    cout << min(a, b) << "\n";

    return 0;
}

📝3009: 네 번째 점

문제 설명

네 번째 점

해결 방법

직사각형이 만들어질려면 x 좌표와 y 좌표가 같은 값이 각각 2개씩 있으면 된다.
세 점의 좌표를 입력으로 받아서 두 점의 x좌표와 y좌표가 같다면 나머지 하나를 출력한다.

💻소스코드

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;

    if (x1 == x2)
        cout << x3 << " ";
    else if (x1 == x3)
        cout << x2 << " ";
    else
        cout << x1 << " ";

    if (y1 == y2)
        cout << y3 << "\n";
    else if (y1 == y3)
        cout << y2 << "\n";
    else
        cout << y1 << "\n";

    return 0;
}

📝4153번: 직각삼각형

문제 설명

직각삼각형

해결 방법

입력으로 받은 세 변의 길이 중 어떤 값이 가장 큰지 모르니 먼저 가장 큰 값을 찾는 과정을 분기로 나눈 후 피타고라스 정리를 이용한다.

💻소스코드

#include <iostream>

using namespace std;

int main()
{
    // 직각삼각형
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    while (true) {
        int a, b, c;
        cin >> a >> b >> c;

        if (a == 0 && b == 0 && c == 0)
            break;

        if (a > b && a > c) {
            if (b * b + c * c == a * a)
                cout << "right\n";
            else
                cout << "wrong\n";
        }
        else if (b > a && b > c) {
            if (a * a + c * c == b * b)
                cout << "right\n";
            else
                cout << "wrong\n";
        }
        else if (c > a && c > b) {
            if (a * a + b * b == c * c)
                cout << "right\n";
            else
                cout << "wrong\n";
        }
    }

	return 0;
}

📝2477번: 참외밭

문제 설명

참외밭

해결 방법

육각형의 넓이를 구한 후 입력으로 들어온 K 값을 곱하면 된다.
육각형의 넓이는 큰 사각형의 넓이에서 비어있는 작은 사각형의 넓이를 빼서 구한다.
입력으로 들어온 6개의 값을 벡터에 push_back 한 후 벡터를 순회하면서 곱이 가장 큰 값을 구한다.
이 때의 앞선 인덱스i를 check에 저장해둔다.
작은 사각형의 넓이는 구조 상 i의 3번째, 4번째 변의 길이의 곱일 수 밖에 없다.

💻소스코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    // 참외밭
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    // K: 단위 면적 당 자라는 참외의 수, direc: 방향, length: 변의 길이
    int K, direc, length;
    // big_sq: 육각형에서 큰 사각형, little_sq: 육각형에서 작은 사각형, check: 큰 사각형을 이루는 변의 인덱스
    int big_sq = 0, little_sq = 0, check = 0;
    vector<pair<int, int>> v;

    cin >> K;    
    for (int i = 0; i < 6; i++) {
        cin >> direc >> length;
        v.push_back({direc, length});   // 방향, 길이
    }
    // 곱한 값중 가장 큰값을 저장
    // 마지막 입력과 첫 번째 입력의 곱이 가장 큰 사각형이 될 수 있음을 인지 !
    for (int i = 0; i < 6; i++) {
        if (big_sq < v[i].second * v[(i + 1) % 6].second) {
            big_sq = v[i].second * v[(i + 1) % 6].second;
            check = i;
        }
    }
    // 큰 사각형의 한 변 인덱스의 +3, 4번째 변의 곱이 작은 사각형일 수 밖에 없음.
    little_sq = v[(check + 3) % 6].second * v[(check + 4) % 6].second;
    cout << (big_sq - little_sq) * K << "\n";

    return 0;
}

profile
성장 = 학습 + 적용 + 회고

0개의 댓글