PS_Baekjoon

[백준 C++] 2563번 : 색종이

SMILELY 2023. 3. 11. 17:14

https://www.acmicpc.net/problem/2563

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

풀이 :

- 100*100 크기의 도화지 위에 10*10크기의 색종이를 들어온 좌표에 따라 붙인다.

- 색종이는 겹쳐서 붙여질 수도 있다. 색종이가 붙여진 영역의 크기를 구해야 한다.

- 도화지의 크기와 색종이의 크기가 크지 않아서 색종이의 좌표가 들어올 때마다 2중 for문을 돌려도 시간 초과가 나지 않는다.

- 입력과 동시에 배열에 true값을 주고, 입력이 끝난 후 전체 도화지를 탐색하며 true값만 카운트 해줬다.

 

코드 :

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

int main(){
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    
    int n, ans = 0;
    bool paper[100][100] = {false, }; //색종이를 붙일 도화지 배열 false로 초기화
    pair<int, int> p; //들어올 색종이의 값

    cin >> n;
    for(int i=0; i<n; i++){
        cin >> p.first >> p.second;
        for(int j=p.first; j<p.first+10; j++){ //색종이 사이즈에 맞춰서 +10하고,
            for(int k=p.second; k<p.second+10; k++){ //그 크기 안은 전부 true로 전환
                paper[j][k] = true;
            }
        }
    }
    for(int i=0;i<100; i++){ //도화지 크기 100*100을 탐색하면서 true일 경우
        for(int j=0; j<100; j++){ //즉, 색종이가 붙여진 경우 ans++
            if(paper[i][j]){
                ans++;
            }
        }
    }
    cout << ans << '\n';
}