본문 바로가기
Problem Solving/BOJ

백준 2563번 색종이 - C++ 풀이

by 어멘드 2023. 9. 4.
반응형

 

1. 도화지를 100X100 그리드로 나눈다.
2. 각 색종이를 추가하면서 그리드에 색종이가 붙어있음을 표시한다.
3. 모든 그리드를 탐색하면서 색종이가 붙은 그리드의 개수를 센다.

 

1. 도화지를 100X100 그리드로 나눈다.

 색종이가 붙은 영역의 넓이를 구해야 한다. 넓이 계산을 쉽게 하기 위해 각 칸의 넓이가 1이 되도록 그리드를 그린다. 100X100으로 나누면 된다.

 

2. 각 색종이를 추가하면서 그리드에 색종이가 붙어있음을 표시한다.

 각 색종이의 위치가 주어진다. 모든 색종이의 크기는 10X10으로 동일하므로, 색종이가 붙는 100개의 그리드를 순회하면서 해당 그리드에 색종이가 붙었음을 기록해둔다.

 

3. 모든 그리드를 탐색하면서 색종이가 붙은 그리드의 개수를 센다.

 모든 색종이를 붙였으면 이제 100x100 개의 그리드를 탐색하면서 색종이가 붙어있는 것의 개수를 센다. 각 그리드의 넓이가 1이었으므로 개수 = 넓이가 된다.


#include <iostream>
#include <vector>

using namespace std;

const int MAX = 100;
const int SIZE_OF_PAPER = 10;

int N;
bool board[MAX][MAX];

int countNumberOfGrid() {
    int ret = 0;
    
    for (int i=0; i<MAX; i++) {
        for (int j=0; j<MAX; j++) {
            if (board[i][j]) ret++;
        }
    }
    
    return ret;
}

void addPaper(int hlo, int vlo) {
    int hhi = hlo + SIZE_OF_PAPER;
    int vhi = vlo + SIZE_OF_PAPER;
    
    for (int r=vlo; r<vhi; r++) {
        for (int c=hlo; c<hhi; c++) {
            // 그리드 (r,c)에 색종이가 붙어있음
            board[r][c] = true;
        }
    }
}

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

    cin >> N;
    for (int i=0; i<N; i++) {
        int hlo, vlo;
        cin >> hlo >> vlo;
        addPaper(hlo, vlo);
    }

    cout << countNumberOfGrid();
    
    return 0;
}

 

반응형

댓글