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';
}