IT 프로그래밍/객체지향프로그래밍

객체지향프로그래밍 3과 그룹액티비티 총정리

기술1 2024. 4. 21. 17:15
반응형

객체지향프로그래밍 1번

정답 5 5

이 코드는 함수 f를 호출하여 변수 p와 q를 전달하고, 해당 함수 내에서 변수 p는 증가하고 변수 q는 감소합니다. 이후 main 함수에서 p와 q의 값을 출력합니다.

함수 f에서 x는 참조로 전달되었기 때문에 값이 변경될 수 있습니다. 따라서 p의 값은 증가하고, q의 값은 감소합니다.

따라서 출력 결과는 "5 4"가 될 것입니다. 왜냐하면 함수 f에서 x는 참조로 전달되어 p와 같은 변수를 가리키고 있으므로 x를 증가시키면 p의 값도 증가합니다. 반면에 y는 값으로 전달되었기 때문에 q와는 별개의 변수이며, y를 감소시켜도 q의 값은 변하지 않습니다.

 


이 코드는 함수 something을 호출하여 변수 t와 s를 전달하고, 해당 함수 내에서 변수 a는 값으로, 변수 b는 참조로 전달됩니다. 함수 내에서는 변수 a의 값을 변경하고, 변수 b의 값을 변경합니다.

함수 something에서는 a에 2를 더한 값을 임시 변수 c에 할당하고, a에 3을 곱한 값을 다시 a에 할당합니다. 그리고 b에는 c와 a의 합을 할당합니다.

따라서 main 함수에서 something 함수를 호출할 때 t와 s가 전달되었으므로, t는 값으로 전달되고 s는 참조로 전달됩니다. 함수 내에서는 t의 값이 변경되지만 s의 값은 변경되지 않습니다.

따라서 출력 결과는 "1 14 3"입니다. 이는 r은 변하지 않고, s는 b가 참조로 전달되어 함수 내에서 변경된 값이 반영되어 14가 됩니다. 그러나 t는 함수 내에서 값으로 전달되었으므로 함수 내에서 변경되더라도 원래의 값이 유지됩니다.

이 코드는 fun이라는 함수를 정의합니다. 이 함수는 정수형 변수 x를 정적으로 선언하고 초기값을 10으로 설정합니다. 그런 다음 x의 참조를 반환합니다.

main 함수에서는 fun()을 호출하여 반환된 x의 참조를 얻은 다음 이를 통해 x의 값을 30으로 변경합니다. 마지막으로 변경된 x의 값을 출력합니다.

코드 실행 결과는 "30"이 출력됩니다. 이는 fun() 함수가 반환하는 참조를 통해 x의 값을 변경하였기 때문입니다. fun() 함수는 정적으로 선언되어 있기 때문에 함수가 호출될 때마다 x의 값이 초기화되지 않고 유지되며, 이는 main 함수에서 fun()을 호출하여 값을 변경할 수 있는 것을 가능하게 합니다.

오른쪽은 10이 출력됩니다. 

 


이 코드는 정수형 변수 x를 선언하고 10으로 초기화합니다. 그런 다음 x의 참조를 가리키는 참조 변수 ref를 선언합니다.

ref를 통해 x의 값을 변경하고, 변경된 값은 x에도 반영됩니다. 따라서 x의 값은 20이 됩니다. 그 후 x의 값을 다시 30으로 변경하면 ref를 통해 접근한 값도 변경됩니다. 따라서 ref의 값은 30이 됩니다.

따라서 이 코드는 다음과 같이 출력됩니다:
x = 20
ref = 30
즉, x의 값은 20이 되고, ref가 가리키는 값도 30이 되었습니다

 

함수 calCost에서는 제품 개수에 따라 부가세를 계산하고 있습니다. 하지만 제품 개수가 10보다 큰 경우와 작은 경우에 대한 조건이 반대로 되어 있습니다.

따라서 제품 개수가 15로 주어졌을 때, 10보다 크므로 subTotal을 15 * 0.20 = 3으로 계산합니다. 그리고 taxCost를 subTotal의 10%인 0.3으로 할당합니다.

따라서 출력 결과는 " 3 0.3"이 아니라 " 3 0"이 됩니다. subTotal은 3이고, tax는 0입니다.

코드를 수정하여 올바른 결과를 얻으려면 함수 calCost에서 조건문을 수정해야 합니다. 조건문을 count < 10에서 count >= 10으로 변경하면 됩니다. 이렇게 하면 제품 개수가 10 이상일 때 올바르게 계산될 것입니다.

 

이 코드는 배열을 매개변수로 받는 함수 func를 정의하고, 배열의 첫 번째, 두 번째 및 세 번째 요소를 각각 증가시키는 역할을 합니다.

main 함수에서는 크기가 3인 정수형 배열 num을 선언하고 {1, 2, 3}으로 초기화합니다. 그런 다음 func 함수를 호출하여 이 배열을 전달합니다.

func 함수 내에서는 배열의 첫 번째 요소부터 세 번째 요소까지를 1씩 증가시킵니다.

마지막으로 main 함수에서는 변경된 배열 num의 요소들을 출력합니다.

따라서 main 함수에서 출력되는 결과는 "2 3 4"입니다. 배열 num의 첫 번째 요소는 1에서 1 증가하여 2가 되었고, 두 번째 요소는 2에서 1 증가하여 3이 되었으며, 세 번째 요소는 3에서 1 증가하여 4가 되었습니다.

이 코드는 func라는 함수를 정의하고, vector<int> 타입의 매개변수를 받습니다. 함수 내에서는 v 벡터의 첫 번째, 두 번째 및 세 번째 요소를 각각 1씩 증가시킵니다.

main 함수에서는 크기가 3인 num 벡터를 선언하고 초기화합니다. 그런 다음 func 함수를 호출하여 num 벡터를 전달합니다.

그러나 func 함수의 매개변수 v는 값으로 전달되기 때문에 함수 내에서 v를 변경해도 원래의 num 벡터는 변하지 않습니다.

따라서 main 함수에서 출력되는 결과는 "1 2 3"입니다. num 벡터의 요소들은 변경되지 않고 초기화된 값인 {1, 2, 3} 그대로 유지됩니다.

함수 func는 vector<int> 타입의 매개변수 v를 받습니다. 함수 내에서는 v 벡터의 첫 번째, 두 번째 및 세 번째 요소를 각각 1씩 증가시킵니다.

main 함수에서는 크기가 3인 num 벡터를 선언하고 초기화합니다. 그런 다음 func 함수를 호출하여 num 벡터를 전달합니다.

그러나 함수 func에서 v 벡터를 값으로 받았기 때문에 함수 내에서 v를 변경하더라도 원래의 num 벡터는 영향을 받지 않습니다.

따라서 main 함수에서 출력되는 결과는 "1 2 3"입니다. num 벡터의 요소들은 변경되지 않고 초기화된 값인 {1, 2, 3}이 유지됩니다.

이 코드는 func 함수를 정의하고, 이 함수는 vector<int>를 인자로 받아서 첫 번째, 두 번째, 세 번째 요소를 각각 1씩 증가시킵니다.

main 함수에서는 크기가 3이고 요소가 1, 2, 3으로 초기화된 num 벡터를 생성합니다. 그리고 func 함수를 호출하여 num 벡터를 전달합니다.

그러나 함수 func에서는 벡터를 값으로 받았기 때문에 함수 내에서 벡터를 변경하더라도 원래의 num 벡터는 영향을 받지 않습니다. 따라서 출력 결과는 "1 2 3"이 됩니다. 초기화된 값 그대로 출력됩니다.

 

객체지향프로그래밍 2번

주어진 코드는 문자열의 앞뒤에 있는 알파벳이 아닌 문자를 제거하고, 문자열을 소문자로 변환한 후 출력하는 것을 목표로 합니다. 그러나 현재의 코드는 기능을 제대로 수행하지 않습니다. 그 이유는 tolowercase 함수가 문자열을 수정하지 않기 때문입니다.

tolowercase 함수는 문자열을 참조로 받고 있지만, 함수 내에서 문자열을 수정하는 방법이 올바르게 구현되지 않았습니다. 현재의 코드는 문자열의 복사본을 수정하고 있기 때문에 원래의 문자열 str은 변경되지 않습니다.

따라서 tolowercase 함수를 수정하여 문자열을 직접 수정하도록 해야 합니다. 이를 위해 함수 매개변수를 참조로 받는 대신, 포인터로 변경하고 함수 내에서 포인터가 가리키는 문자열을 수정해야 합니다. 그리고 trim 함수는 문자열을 값으로 받기 때문에 그대로 두어야 합니다.

아래는 수정된 코드입니다.

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

string trim(string str)
{
    int s = 0, t = str.length() - 1;
    while (s < str.length() && !isalpha(str[s]))
        s++;
    while (t >= 0 && !isalpha(str[t]))
        t--;
    if (s <= t)
        return str.substr(s, t - s + 1);
    else
        return "";
}

void tolowercase(string* str) // 수정: 포인터로 변경
{
    for (int i = 0; i < str->length(); i++) // 수정: 포인터가 가리키는 문자열을 수정
        (*str)[i] = tolower((*str)[i]);
}

int main()
{
    string str = "   How fun is C++ !! ";
    tolowercase(&str); // 수정: 포인터 전달
    cout << trim(str) << endl; // 수정: trim 함수에 전달된 문자열 출력
    return 0;
}

 

객체지향프로그래밍 3번

이 프로그램에서 문제는 concat 함수가 문자열을 반환할 때 참조를 반환한다는 점입니다. concat 함수 내에서 combined 변수는 로컬 변수로 선언되었습니다. 이 변수는 함수가 끝나면 파괴되므로, 반환된 참조는 더 이상 유효하지 않습니다. 이로 인해 merged 변수가 무효한 참조를 가지게 되어 예기치 않은 동작이 발생할 수 있습니다.

해결책은 두 가지입니다. 첫 번째로는 concat 함수가 문자열을 직접 반환하도록 변경하는 것입니다. 두 번째로는 combined 변수를 동적으로 할당하고 이에 대한 참조를 반환하는 것입니다. 두 번째 방법을 사용하면 함수가 끝나도 문자열이 메모리에서 사라지지 않습니다.

첫 번째 방법으로 코드를 수정하면 다음과 같습니다:

#include <iostream>
#include <string>
using namespace std;

string concat(string str1, string str2) {
    string combined = str1 + str2;
    return combined;
}

int main() {
    string first = "How fun";
    string second = " is C++ !";
    string merged = concat(first, second);
    cout << merged << endl;
    return 0;
}

 

#include <iostream>
#include <string>
using namespace std;

string& concat(string str1, string str2) {
    string* combined = new string(str1 + str2);
    return *combined;
}

int main() {
    string first = "How fun";
    string second = " is C++ !";
    string& merged = concat(first, second);
    cout << merged << endl;
    delete &merged; // 동적 할당된 메모리를 해제해야 합니다.
    return 0;
}

 

객체지향프로그래밍 4번

#include <iostream>
#include <string>
using namespace std;

string& concat(string& str1, const string& str2) {
    str1 += str2;
    return str1;
}

int main() {
    string first = "Hello ";
    string second = "C++ ";
    string third = "programming";

    concat(concat(first, second), third);
    cout << first << endl;

    return 0;
}

위의 프로그램은 세 개의 문자열을 첫 번째 문자열에 순차적으로 추가하여 출력하는 것을 목표로 합니다. 현재 주어진 프로그램에서는 세 개의 문자열을 합치는 기능을 제공하는 concat 함수가 구현되어 있지 않습니다. 따라서 이 함수를 작성하여 기존의 프로그램을 수정해야 합니다.

concat 함수는 문자열을 합치는 데 사용됩니다. 이 함수는 첫 번째 문자열과 두 번째 문자열을 인자로 받아 첫 번째 문자열에 두 번째 문자열을 덧붙입니다. 그리고 변경된 첫 번째 문자열의 참조를 반환합니다.

이렇게 함으로써 concat(concat(first, second), third)의 결과로 first 문자열에 second와 third 문자열이 순차적으로 추가되어 "Hello C++ programming"이 출력됩니다. 기존의 main 함수 코드는 변경되지 않고, concat 함수만 추가되었습니다.

 

객체지향프로그래밍 5번

C++에서 배열은 일련의 연속된 메모리 공간에 연속적으로 저장된 데이터의 집합으로 표현됩니다. 배열을 함수에 전달할 때는 해당 배열의 시작 메모리 주소가 전달됩니다. 이는 배열이 포인터로 처리되는 이유입니다. 따라서 배열을 함수에 전달할 때 실제로는 배열의 복사본이 전달되는 것이 아니라 배열의 첫 번째 요소에 대한 포인터가 전달됩니다.

값에 의한 매개변수 전달에서 배열을 함수에 전달하면 함수 내에서 해당 배열의 요소를 변경할 수 있습니다. 이는 함수가 받은 포인터를 사용하여 메모리의 원본 데이터를 직접 변경하기 때문입니다. 따라서 함수 내에서 배열의 값을 변경하면 호출된 쪽의 배열에도 변경된 값이 반영됩니다.

이러한 동작은 배열이 포인터로 처리되기 때문에 발생합니다. 함수에 배열을 전달할 때는 배열의 시작 주소(즉, 첫 번째 요소의 주소)가 전달되며, 함수 내에서 이 주소를 사용하여 배열의 요소에 접근할 수 있습니다. 이는 배열을 복사하는 것이 아니라 배열의 원본 데이터에 대한 포인터를 전달하는 것입니다.

따라서 C++에서 배열이 값에 의한 매개변수로 전달될 때, 함수 내에서 배열의 요소를 변경하면 호출된 쪽의 배열에도 변경이 반영되는 것은 배열이 포인터로 전달되기 때문입니다. 이러한 특성은 배열을 함수에 전달할 때 발생하는 현상으로, 값에 의한 매개변수 전달의 예외가 아니라 C++의 특성 중 하나입니다.

 

객체지향프로그래밍 6번

이 코드는 클래스 A를 정의하고 main 함수에서 객체 x를 생성한 다음 멤버 변수 a, b, s에 값을 할당합니다. 그런 다음에는 객체 y를 x로 할당하고, y의 멤버 변수들을 출력합니다.

main 함수에서의 출력은 y 객체가 x 객체로 복사된 후에 y.a, y.b, y.s 값이 출력됩니다. 따라서 출력 결과는 1 2 hello가 됩니다.

객체 y를 x로 할당할 때, 클래스 A의 멤버 변수들은 각각 복사됩니다. 이는 기본 복사 생성자에 의해 이루어집니다. 따라서 y.a, y.b, y.s는 각각 x.a, x.b, x.s의 값을 복사하여 가지게 됩니다. 따라서 y 객체의 멤버 변수들은 x 객체의 값과 동일합니다.

저, 코드에서는 x.arr[0]에 1을, x.arr[1]에 2를 할당한 후에 x를 y에 복사합니다. 그 다음에 y.arr[0]에 3을 할당합니다.

따라서 출력은 3 2가 나와야 합니다.

하지만 코드를 실행해보면 출력이 3 2 1이 되고 있습니다. 이 결과는 예상과는 다릅니다. 이유는 배열 arr의 복사가 얕은 복사(shallow copy)로 이루어졌기 때문입니다.

y = x; 문장은 얕은 복사를 수행합니다. 즉, x.arr의 메모리 주소를 y.arr에 복사하는 것이 아니라, x.arr의 포인터 값을 y.arr에 복사합니다. 따라서 x와 y는 같은 배열을 가리키게 됩니다. 이후 y.arr[0] = 3; 문장은 사실상 x.arr[0]도 3이 되도록 변경합니다. 따라서 x.arr[0]도 3이 되고, y.arr[0]도 3이 됩니다.

따라서 출력 결과는 3 2 1이 됩니다.

 

이 결과는 다음과 같은 과정을 거쳐서 나옵니다:

x.vec에 1과 2를 추가합니다.
y 객체를 x 객체로 할당합니다. 이는 x.vec의 값을 y.vec로 복사합니다.
y.vec[0]을 3으로 변경합니다.
y.vec[0]은 3이 되었고, y.vec[1]은 2입니다.
x.vec[0]은 여전히 1로 유지됩니다.
이 결과에서 볼 수 있듯이, vector는 동적 배열이므로 복사가 얕은 복사가 아닌 깊은 복사(deep copy)로 이루어집니다. 따라서 x.vec와 y.vec는 서로 다른 메모리 공간에 저장된 독립적인 배열입니다. 따라서 하나를 변경하더라도 다른 하나에는 영향을 주지 않습니다.

이 코드는 클래스 A를 정의하고 main 함수에서 객체 x를 생성합니다. A 클래스에는 정수형 배열 arr이 포함되어 있습니다.

그런 다음 main 함수에서는 x.arr[0]에 1을, x.arr[1]에 2를 할당하고, 함수 func을 호출합니다. func 함수는 A 클래스의 객체를 매개변수로 받아들이고 해당 객체의 배열 요소들을 증가시킵니다.

그리고나서 main 함수에서 x.arr[0]과 x.arr[1]을 출력합니다.

이 코드의 출력은 1 2가 됩니다.

func 함수는 A 클래스의 객체를 값에 의한 전달로 받아들입니다. 따라서 x 객체를 func 함수에 전달할 때 객체의 복사본이 생성됩니다. 함수 내에서 배열의 값을 변경해도 원본 객체에는 영향을 주지 않습니다. 따라서 main 함수에서 x.arr[0]과 x.arr[1]을 출력하면 변경된 값이 반영되지 않은 1과 2가 출력됩니다.

 

오른쪽은 2,3이 됩니다.

 

이 코드는 클래스 A를 정의하고 main 함수에서 객체 x와 y를 생성합니다. A 클래스에는 정수형 멤버 변수 a와 b가 포함되어 있습니다.

그런 다음 x.a에 1을, x.b에 2를 할당한 후에 x 객체를 y 객체에 할당합니다. 그리고나서 x와 y가 같은지를 비교합니다.

그러나 이 코드는 컴파일 에러를 발생시킵니다. == 연산자는 기본적으로 클래스 타입에 대해 정의되어 있지 않기 때문에 A 클래스의 객체끼리의 비교가 불가능합니다.

해결 방법은 다음과 같습니다:

A 클래스에 == 연산자를 오버로딩하여 객체 간의 비교를 정의합니다.
x.a와 y.a, x.b와 y.b를 각각 비교하여 같은지 확인합니다.
첫 번째 방법을 사용하는 경우, A 클래스에 다음과 같이 == 연산자를 오버로딩할 수 있습니다:

class A
{
public:
    int a, b;
    
    bool operator==(const A& other) const {
        return (a == other.a) && (b == other.b);
    }
};

 

#include <iostream>
#include <vector>
using namespace std;

class A
{
public:
    int a, b;
};

int main()
{
    A x, y;
    x.a = 1, x.b = 2;
    y = x;
    if (x.a == y.a && x.b == y.b)
        cout << "Equal";
    else
        cout << "Not equal";
}

 

객체지향프로그래밍 7

 

#include <iostream>
#include <vector>
#include <cmath>

class Circle {
private:
    double radius;
    double center_x;
    double center_y;

public:
    Circle(double r, double x, double y) : radius(r), center_x(x), center_y(y) {}

    double getRadius() const {
        return radius;
    }

    double getCenterX() const {
        return center_x;
    }

    double getCenterY() const {
        return center_y;
    }

    double area() const {
        return M_PI * radius * radius;
    }

    bool intersect(const Circle& other) const {
        double distance = sqrt((center_x - other.center_x) * (center_x - other.center_x) +
                               (center_y - other.center_y) * (center_y - other.center_y));
        return distance < (radius + other.radius);
    }

    double distanceToCenter(double x, double y) const {
        return sqrt((center_x - x) * (center_x - x) + (center_y - y) * (center_y - y));
    }
};

Circle 클래스:

멤버 변수:
radius: 원의 반지름을 나타내는 변수
center_x, center_y: 원의 중심 좌표를 나타내는 변수
생성자 Circle(double r, double x, double y):
주어진 반지름과 중심 좌표를 사용하여 Circle 객체를 초기화합니다.
메서드 double getRadius() const:
원의 반지름을 반환합니다.
메서드 double getCenterX() const와 double getCenterY() const:
원의 중심 좌표를 각각 x 좌표와 y 좌표로 반환합니다.
메서드 double area() const:
원의 넓이를 계산하여 반환합니다.
메서드 bool intersect(const Circle& other) const:
다른 Circle 객체와 현재 Circle 객체가 교차하는지를 확인합니다.
두 원의 중심 사이의 거리를 계산하고, 이 거리가 두 반지름의 합보다 작으면 교차한 것으로 판단합니다.
교차하면 true를, 그렇지 않으면 false를 반환합니다.
메서드 double distanceToCenter(double x, double y) const:
주어진 점으로부터 원의 중심까지의 거리를 계산하여 반환합니다.

 

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

class Circle {
private:
    double radius;
    double center_x;
    double center_y;

public:
    Circle(double r, double x, double y) : radius(r), center_x(x), center_y(y) {}

    double getRadius() const {
        return radius;
    }

    double getCenterX() const {
        return center_x;
    }

    double getCenterY() const {
        return center_y;
    }

    double area() const {
        return M_PI * radius * radius;
    }

    bool intersect(const Circle& other) const {
        double distance = sqrt((center_x - other.center_x) * (center_x - other.center_x) +
                               (center_y - other.center_y) * (center_y - other.center_y));
        return distance < (radius + other.radius);
    }

    double distanceToCenter(double x, double y) const {
        return sqrt((center_x - x) * (center_x - x) + (center_y - y) * (center_y - y));
    }
};

// 원들을 면적순으로 정렬하는 함수
void sortByArea(std::vector<Circle>& circles) {
    std::sort(circles.begin(), circles.end(), [](const Circle& c1, const Circle& c2) {
        return c1.area() < c2.area();
    });
}

// 교차하는 모든 원 쌍을 찾는 함수
std::vector<std::pair<Circle, Circle>> findIntersectingPairs(const std::vector<Circle>& circles) {
    std::vector<std::pair<Circle, Circle>> intersecting_pairs;
    for (size_t i = 0; i < circles.size(); ++i) {
        for (size_t j = i + 1; j < circles.size(); ++j) {
            if (circles[i].intersect(circles[j])) {
                intersecting_pairs.emplace_back(circles[i], circles[j]);
            }
        }
    }
    return intersecting_pairs;
}

// 주어진 점으로부터 가장 가까운 원의 중심까지의 거리를 구하는 함수
double closestDistanceToCenter(const std::vector<Circle>& circles, double x, double y) {
    double min_distance = std::numeric_limits<double>::max();
    for (const auto& circle : circles) {
        double distance = circle.distanceToCenter(x, y);
        if (distance < min_distance) {
            min_distance = distance;
        }
    }
    return min_distance;
}

int main() {
    // 테스트용 원들
    std::vector<Circle> circles = {
        {3, 0, 0},   // 반지름이 3이고 중심이 (0, 0)인 원
        {2, 1, 1},   // 반지름이 2이고 중심이 (1, 1)인 원
        {4, -1, 2},  // 반지름이 4이고 중심이 (-1, 2)인 원
        {5, 2, -1}   // 반지름이 5이고 중심이 (2, -1)인 원
    };

    // 원들을 면적순으로 정렬
    sortByArea(circles);

    // 교차하는 모든 원 쌍을 찾음
    std::vector<std::pair<Circle, Circle>> intersecting_pairs = findIntersectingPairs(circles);
    std::cout << "교차하는 원 쌍의 개수: " << intersecting_pairs.size() << std::endl;

    // (0, 0)으로부터 가장 가까운 원의 중심까지의 거리를 구함
    double closest_distance = closestDistanceToCenter(circles, 0, 0);
    std::cout << "(0, 0)으로부터 가장 가까운 원의 중심까지의 거리: " << closest_distance << std::endl;

    return 0;
}

 

객체지향프로그래밍 8

#include <iostream>
#include <vector>

// 점을 나타내는 클래스
class Point {
public:
    double x, y;
    Point(double x_coord, double y_coord) : x(x_coord), y(y_coord) {}
};

// 직교 다각형을 나타내는 클래스
class OrthogonalPolygon {
private:
    std::vector<Point> points; // 다각형의 꼭짓점들을 저장하는 벡터

public:
    // 생성자: 꼭짓점들을 초기화
    OrthogonalPolygon(const std::vector<Point>& input_points) : points(input_points) {}

    // 직교 다각형을 형성하는지 확인하는 메서드
    bool isOrthogonal() const {
        // 다각형의 변 개수가 3 미만이면 직교 다각형이 아님
        if (points.size() < 3) return false;

        // 모든 변이 수평선이거나 수직선인지 확인
        for (size_t i = 0; i < points.size() - 1; ++i) {
            if (points[i].x != points[i+1].x && points[i].y != points[i+1].y)
                return false; // 수평선이나 수직선이 아닌 경우
        }

        // 마지막 점과 첫번째 점을 연결하여 확인
        if (points.front().x != points.back().x && points.front().y != points.back().y)
            return false; // 수평선이나 수직선이 아닌 경우

        return true; // 모든 변이 수평선이거나 수직선이면 직교 다각형
    }
};

int main() {
    // 테스트용 점들
    std::vector<Point> test_points = {{0, 0}, {0, 2}, {2, 2}, {2, 0}};

    // 직교 다각형 객체 생성
    OrthogonalPolygon polygon(test_points);

    // 직교 다각형 여부 출력
    if (polygon.isOrthogonal()) {
        std::cout << "입력된 점들은 직교 다각형을 형성합니다.\n";
    } else {
        std::cout << "입력된 점들은 직교 다각형을 형성하지 않습니다.\n";
    }

    return 0;
}

Point 클래스:
생성자 Point(double x_coord, double y_coord): 주어진 x 좌표와 y 좌표를 사용하여 Point 객체를 초기화합니다.
OrthogonalPolygon 클래스:
생성자 OrthogonalPolygon(const std::vector<Point>& input_points): 주어진 점들로 직교 다각형 객체를 초기화합니다.
메서드 bool isOrthogonal() const: 입력된 점들로 구성된 다각형이 직교 다각형인지를 확인합니다.
다각형의 변 개수가 3 미만이면 직교 다각형이 아닙니다.
모든 변이 수평선이거나 수직선이면 직교 다각형입니다.
모든 변이 수평선이거나 수직선이 아니면 직교 다각형이 아닙니다.
마지막 점과 첫 번째 점을 연결하여도 수평선이거나 수직선이 아니면 직교 다각형이 아닙니다.
위 조건을 만족하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

반응형