[코드트리 챌린지] 9월 3주차 - 시뮬레이션 1 (계속 중첩되는 사각형)

모모·2023년 9월 26일
0

코드트리 챌린지

목록 보기
5/7

시뮬레이션 1의 마지막 문제인 중첩되는 사각형 문제를 풀어보겠습니다!
마지막 문제는 실력체크 문제이므로 정답 해설이 없습니다. 제 코드가 참고가 되면 좋겠습니다:)

☝️시뮬레이션 - 사각형 칠하기

격자에서 사각형을 칠해야하는 문제가 주어지면 이는 2차원 배열로 표현할 수 있다.

이렇게 (2, 5)와 (4, 8)을 양쪽 모서리로 하는 직사각형은 시계방향 90도로 회전한 2차원 배열에서 (2행, 5열)부터 (3행, 7열)로 나타낼 수 있다.
여기서 포인트는 기존 좌표계에서 (x1, y1), (x2, y2)로 이루어진 직사각형이 2차원 배열에서는 (x1 행, y1 열) 부터 (x2 - 1 행, y2 - 1 열) 로 표현된다는 점!!

여기서도 만약 좌표가 음수 값이 나온다면 해당 좌표의 최솟값을 양수로 만들어줄 수 있는 OFFSET을 설정해주어야 한다. 왜냐햐면 배열의 인덱스는 음수가 없기 때문이다.

구간 칠하기 문제가 1차원 배열을 필요로 했다면 사각형 칠하기는 2차원 배열이 필요하다고 생각하면 된다. 구간칠하기 문제에서는 x1, x2 배열을 쓰면서 좌표값을 가져왔다면 이제는 x1, y1, x2, y2 배열을 두고 좌표를 가져와 쓸 수있다.

✌️ 계속 중첩되는 사각형 문제

코드트리 문제 링크

문제

좌표평면 위에 총 n개의 직사각형이 주어집니다. 처음에 주어지는 직사각형은 빨간색이고, 그 다음에 주어지는 직사각형은 파란색입니다. 이와 같이 빨간색, 파란색 순으로 번갈아 가며 주어지고, 겹치는 위치가 있다면 가장 마지막에 덮힌 색으로 취급한다고 했을 때, n개의 직사각형이 주어지고 난 뒤의 파란색 영역의 총 넓이를 구하는 프로그램을 작성해보세요.

입력 형식

첫 번째 줄에는 정수 n이 주어집니다.
두 번째 줄부터 각 줄마다 직사각형에 해당하는 좌측하단의 좌표와 우측상단의 좌표 (x1, y1), (x2, y2)가 공백을 사이에 두고 주어집니다.

1 ≤ n ≤ 10
-100 ≤ x1 < x2 ≤ 100
-100 ≤ y1 < y2 ≤ 100

출력 형식

첫 번째 줄에 파란색 영역의 넓이를 구하여 출력합니다.

입출력 예제
예제1
입력:
2
2 1 7 4
5 -1 10 3

출력:
20

🤟 문제 풀어보기!

빨간색, 파란색 번갈아 가면서 사각형이 주어지므로 빨간색 사각형은 1로, 파란색 사각형은 2로 두었다.
나는 구현하기 쉽게 짝수, 홀수로 구분하여 번갈아가며 1, 2로 표시하였다.

#include <iostream>
#define OFFSET 100 //x, y좌표의 최솟값이 -100
#define MAX_N 10
#define MAX_R 200

using namespace std;

int x1[MAX_N], x2[MAX_N], y1[MAX_N], y2[MAX_N];
int checked[MAX_R+1][MAX_R+1];
int n, cnt;

int main() {
    cin >> n;
    
    for(int i=0; i<n; i++){
        cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];

        x1[i] += OFFSET;
        x2[i] += OFFSET;
        y1[i] += OFFSET;
        y2[i] += OFFSET;
    }

    for(int i=0; i<n; i++){
        for(int x=x1[i]; x<x2[i]; x++){
            for(int y=y1[i]; y<y2[i]; y++){
                if(i%2==0){
                    checked[x][y] = 1; //빨강
                }else{
                    checked[x][y] = 2; //파랑
                }
            }
        }
    }

    for(int i=0; i<=MAX_R; i++){
        for(int j=0; j<=MAX_R; j++){
            if(checked[i][j] == 2){ //파랑의 개수
                cnt++;
            }
        }
    }
    cout << cnt;
    return 0;
}
profile
코딩하는 사람입니다. 궁금한 거 많이 물어보고 있어요 :)

0개의 댓글