IT 프로그래밍/백준

[c++] 백준 2563번 색종이

기술1 2024. 5. 22. 15:00
반응형

문제

코드

#include <iostream>

using namespace std;

int main()
{
    int arr[101][101] = { 0, };  // 101x101 크기의 2차원 배열을 0으로 초기화하여 선언
    int a, b;

    int num;

    cin >> num;  // 사각형의 수를 입력받음
    int answer = 0;

    // num개의 사각형을 입력받아 그리기
    for (int k = 0; k < num; k++)
    {
        cin >> a >> b;  // 사각형의 시작 좌표 (a, b)를 입력받음
        for (int i = a; i < a + 10; i++)  // a부터 a+10까지 반복 (10x10 크기의 사각형을 그리기 위함)
        {
            for (int j = b; j < b + 10; j++)  // b부터 b+10까지 반복
            {
                arr[i][j] = 1;  // 사각형의 해당 영역을 1로 채움
            }
        }
    }

    // 그려진 사각형의 총 면적 계산
    for (int i = 1; i < 101; i++)  // 1부터 100까지 반복 (101은 포함되지 않음)
    {
        for (int k = 1; k < 101; k++)  // 1부터 100까지 반복 (101은 포함되지 않음)
        {
            if (arr[i][k] == 1)  // 배열의 값이 1인 경우 (사각형이 그려진 부분)
            {
                answer += 1;  // 면적을 1씩 증가
            }
        }
    }
    cout << answer << endl;  // 총 면적 출력

    return 0;
}

 

해설

처음에는 어떻게 푸는지 조금 시간이 걸렸습니다. 겹치는 부분을 전체 영역에서 빼서 구해야 하나? 생각을 하다가 도저히 모르겠어서 다른 정답 풀이의 푸는 방법을 조금 보고서 풀었습니다.

 

이걸 푸는 요령 2차원 배열을 만들어서 하나씩 세주는 것입니다. arr[101][101] 이런 식으로 만들어서 처음에 0으로 전부 초기화를 한 다음 색종이 부분을 1로 바꾼 다음에 맨 마지막에 총합을 구해주는 방식입니다. 

 

코드의 주요 포인트

int arr[101][101] = {0, } 을 통해 2차원 배열을 0으로 초기화합니다. 이 배열은 각 좌표에 사각형이 그려졌는지 확인합니다.

a. b를 받아 10x10 크기의 사각형을 이중 for문을 통해 그립니다. 

면적 계산하는 것은 2차웑 배열을 순회하며 값이 1인 좌표의 수를 세는 방법으로 진행합니다. 

 

int a, b;
int num;
int answer = 0;

a, b는 사각형의 시작 좌표이며 num은 사각형의 개수, answer은 총 면적입니다. 

 

for (int k = 0; k < num; k++)
{
    cin >> a >> b;
    for (int i = a; i < a + 10; i++)
    {
        for (int j = b; j < b + 10; j++)
        {
            arr[i][j] = 1;
        }
    }
}

사각형의 수만큼 반복하여 각 사각형의 시작 좌표 ('a','b')를 입력받고, 10x10 크기의 사각형을 그립니다. 배열 'arr'의 해당 영역을 1로 설정하여 사각형이 그려진 부분을 표시합니다.

 

for (int i = 1; i < 101; i++)
{
    for (int k = 1; k < 101; k++)
    {
        if (arr[i][k] == 1)
        {
            answer += 1;
        }
    }
}

배열 arr를 순회하며 값이 1인 좌표의 수를 셉니다. 이는 겹치는 영역을 한 번만 계산하기 위해서입니다. 

 

이후 cout << answer << endl; 으로 계산된 총 면적을 출력합니다.

 

사실 처음에 이 방법으로 익히기가 어려울 것 같습니다. 그래서 어떻게 푸는지 요령 정도는 간단히 보고서 직접 풀어보시는 것을 추천합니다. 

반응형