
생각
첫 번째 자연수 : 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이 거리
두 번째 자연수 : 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이 거리
겹치는 영역을 어떻게 처리할 것인가? ▶100*100 영역이니까 색종이가 안 덮힌 부분을 빼도 되겠다
or
100*100의 0으로 채워진 배열을 만들고, 검정색 색종이를 덮은 영역만 1로 바꾸자
그럼 넓이는 행렬에서 1의 개수만 세면 된다.
1. 첫 번째 자연수부터 오른쪽 10칸을 1로
2. 두 번째 자연수부터 위로 10칸을 1로 채우자
정말 조심했어야 할 점이 있다. 이것때문에 자꾸 헤맸다.
두 번째 자연수가 색종이의 왼쪽 아래점을 의미한다. 그래서 아무 생각 없이 '1을 위에서부터 채워 내려오면 되겠군' 이라는 생각을 담은 루프를
for(int k=b+10; k>b; k--)
이렇게 정의해버렸다.
2차원 배열에서는 좌측상단 [0][0], 우측하단 [100][100]이기 때문에, 만약 두 번째 자연수가 90보다 컸다면면 배열 칸을 초과해서 1을 채워나가기 시작한다는 의미이다.

#include <algorithm>
#include <iostream>
using namespace std;
int main() {
int n=0;
int arr[100][100] = {{0,}};
int a=0, b=0;
int cnt=0;
cin >> n;
for(int i=0; i<n; i++){
cin >> a >> b;
for(int k=b; k<b+10; k++){
for(int j=a; j<a+10; j++){
arr[k][j] = 1;
}
}
}
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
if(arr[i][j] == 1) cnt ++;
}
}
cout << cnt ;
return 0;
}
주의할 점이 하나 더 있다. 문제에서 주어진 그림에는 1사분면에 도화지가 있는 형태이고 색종이를 덮는데, 2차원 배열은 전개상 4사분면에서 전개하는 것이 편하기 때문에 이중 루프의 바깥쪽 루프를
for(int k=b; k<b+10; k++)
로 정의해서 풀었다.
'공부기록 > [Algorithm]' 카테고리의 다른 글
| 백준 11005번 <진법 변환 2> - C++ (1) | 2024.08.09 |
|---|---|
| 백준 2745번 <진법 변환> - C++ (1) | 2024.08.07 |
| 백준 1157번 <단어 공부> - C++ (0) | 2024.08.04 |
| 백준 5622번 <다이얼> - C++ (1) | 2024.08.03 |
| 백준 1152번 <단어의 개수> - C++ (0) | 2024.08.03 |