반응형

두 사각형의 x,y 시작점,  가로, 세로 길이가 주어졌을 때


겹치는 넓이를 구한다는 것은 처음 접하게 되면 다소 생각이 어려울 수도 있다.


'두 사각형의 겹치는 넓이?? 어디를 기준으로 어떤 케이스를 나누어야되지?? 사각형 a가 사각형 b보다 왼쪽에 있을때? 오른쪽에? 위? 아래?'


이렇게 케이스를 통한 여러 조건문을 이용하여 겹치는 넓이를 구하게 되면 코드 길이도 길어지기 시작하고, 많은 경우의 수 때문에 생각하기가 많이 복잡해진다.



물론 다른 분들도 이 생각을 해보았을지도 모르겠지만, 그리고 더 좋은 방법이 있을지도 모르지만, 주어지는 코드를 통해 잠시나마 생각의 전환을 해보았으면 한다.


방법은 의외로 간단하다.


2차원 배열을 이용하는 것이다.






이러한 식으로 하나의 2차원 배열에 첫번째 사각형의 넓이를 1로 지정하고, 두번째 사각형 넓이를 1로 지정하는데 


이때 만약 첫번째 사각형과 겹쳐지는 부분이 있다면  1에서 2로 바꾸어준다.  



생각의 전환은 실로 코딩에 많은 도움이 되는것같다.



아래는 코드의 전문이다.


코드가 한곳에 뭉쳐있지 않고 각각 cpp와 h로 있다고 어렵다고 생각하지말자.


이 과정이 익숙해져야 코더로써 남에게 자신의 코드를 더욱 명료하게 공개 할 수 있다.


처음은 누구나 어렵다.



- main.cpp -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "myheader.h"
 
 
int main()
{
 
    rectangle rec[2]; // 2개 정사각형 입력될 클래스 생성
    overlap over;
 
    for (int i = 0; i < 2; i++// 2개 정사각형 시작점 , 너비, 높이 입력
    {
        cout << i + 1 << "번째 rect값을 입력하시오 x,y,너비,높이" << endl;
        rec[i].input();
    }
 
    over.init(rec[0], rec[1]); // 2개의 사각형의 꼭지점 좌표점을 확인한다.
    over.overlaprect(rec[0], rec[1]);
 
 
}
Crocus



-d

- rectangle.cpp -



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "myheader.h"
 
rectangle::rectangle() // 아무것도 입력안하고 호출하면
{
    x = 0;
    y = 0;
    width = 0;
    height = 0;
};
void rectangle::input()
{
    cin >> a; // x값
    cin >> b; // y값
    x = a;
    y = b;
 
    cin >> a; // 너비
 
    cin >> b; // 높이
    width = a;
    height = b;
    getarea();
};
//int rectangle::geta() { a = 33; return a; }
int rectangle::getarea()
{
    return width*height;
};
int rectangle::getwidth()
{
    return width;
};
int rectangle::getheight()
{
    return height;
};
int rectangle::getx()
{
    return x;
};
int rectangle::gety()
{
    return y;
};
rectangle::~rectangle() {}; // 소멸자 해제
 
 
Crocus



- overlap.cpp -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
#include "myheader.h"
 
void overlap::init(rectangle rect1, rectangle rect2) // 사각형 x,y 각좌표 모두 지정
{
 
    int check = 0;
    x1 = rect1.getx(); // 왼쪽 x 좌표
    xx1 = rect1.getx() + rect1.getwidth(); // 오른쪽 x 좌표
    y1 = rect1.gety(); // 아래쪽 y 좌표
    yy1 = rect1.gety() + rect1.getheight(); // 위쪽 y 좌표
 
    x2 = rect2.getx(); // 왼쪽 x 좌표
    xx2 = rect2.getx() + rect2.getwidth(); // 오른쪽 x 좌표
    y2 = rect2.gety(); // 아래쪽 y 좌표
    yy2 = rect2.gety() + rect2.getheight(); // 위쪽 y 좌표
 
};
 
void overlap::overlaprect(rectangle rect1, rectangle rect2) // 겹치는지 확인 하는 클래스
{
    int i, j, cnt = 0;
    int map[11][11= { 0, };
 
    for (i = y1; i < yy1; i++)
        for (j = x1; j < xx1; j++)
            map[i][j] ++// 사각형 면적 모두 +1
 
    for (i = y2; i < yy2; i++)
        for (j = x2; j < xx2; j++)
            map[i][j]++// 사각형 면적 모두 +1 여기서 2가 되는 부분들은 겹치는 부분으로 파악가능
 
    for (i = 0; i <= 10; i++)
        for (j = 0; j <= 10; j++)
            if (map[i][j] == 2) cnt++// 겹치는 부분 넓이 합
 
    for (i = 0; i <= 10; i++)
    {
        for (j = 0; j <= 10; j++) {
            printf("%d ", map[i][j]);
        }
        printf("\n");
    }
 
 
    cout << "첫번째 사각형 넓이 :" << rect1.getarea() << endl;
    cout << "두번째 사각형 넓이 :" << rect2.getarea() << endl;
 
    cout << "합친 넓이 :" << rect1.getarea() + rect2.getarea() << endl;
 
 
 
    if (cnt >= 1)
        cout << "겹치는 넓이 " << cnt << endl;
 
    else
        cout << "겹치지 않습니다" << endl;
};
 
Crocus




- myheader.h -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#pragma once
#include <iostream>
#include <math.h>
 
using namespace std;
 
class rectangle
{
private:
    int x, y;
    int width, height;
    int a = 0, b = 0;
 
public:
    rectangle();
    void input();
    //int geta();
    int getarea();
    int getwidth();
    int getheight();
    int getx();
    int gety();
    ~rectangle(); // 소멸자 해제
};
 
 
 
class overlap
{
private:
    rectangle rect1, rect2;
    int width;
    int height;
 
    int x1 = 0, xx1 = 0, y1 = 0, yy1 = 0;
    int x2 = 0, xx2 = 0, y2 = 0, yy2 = 0;
 
public:
    //    overlap();
    void init(rectangle rect1, rectangle rect2);
    void overlaprect(rectangle rect1, rectangle rect2);
};
 
Crocus


반응형