가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

#include<iostream>
using namespace std;
int main(){
int arr[101][101] = {0};
int a,b;//a는 색종이 왼쪽 변과 도화지 왼쪽 변 거리(행)
//b는 색종이 아래쪽 변과 도화지의 아래쪽 변 사이의 거리(열)
int num; //색종이 수
cin >> num;
int answer = 0;
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;
}
for (int i = 1; i < 101; i++)
for (int j = 1; j < 101; j++)
if (arr[i][j] == 1)
answer++;
cout << answer;
return 0;
}
❣️ 문제 요약: 색종이의 행, 열 좌표를 입력 받고 그 넓이를 구해서 도화지 내에서 총 색종이가 차지하는 면적을 구하는 것이다.
코드 설명
✅ int arr[101][101] = {0}; : 도화지가 100*00 크기이므로 배열 크기의 제한을 준다.
✅ int a,b,num; : a는 행의 위치, b는 열의 위치, num은 색종이 수를 입력 받는다.
✅ int answer = 0;: 전체 검은 색종이가 붙은 부분을 입력받을 변수
✅ for(int k=0; k < num ; k++) : 색종이의 수만큼 인덱스를 키워가며 반복문 진행
색종이 하나의 변 길이가 10 이므로 a~ a+10, b~b+10의 이중 반복문으로 2차원 배열을 만들어서 하나의 검정 색종이가 차지하는 부분을 계산한다. 이때 2차원 배열에 색칠된 부분에 1을 넣어주고 그 다음 도화지의 길이 만큼의 범위에서 전체 arr[i][j] == 1 의 수를 반환할 변수에 대입해서 출력한다.
색종이 수와 거리 변수 n ,a, b 를 입력 받는 코드를 적은 후에 그다음에 뭘 적어야하나 한참 고민했다. 그래서 다른 사람의 풀이들을 확인해보고 감을 잡았다. 우선 입력받은 색종이 하나의 넓이를 구하는 반복문이 필요했다. 입력 받은 좌표가 a,b 이면 색종이 한 면의 길이는 10이기 때문에 a 부터 a+10 의 범위에서 검은 색종이가 붙은 부분 하나를 (a,b) 로 1씩 하나한 세어야 한다. 그 다음 색종이의 전체 범위 100*100안에서 검은 색종이가 붙은 부분 arr[i][j] = 1 의 갯수를 전부 다 세면 검은 종이가 붙은 전체가 된다. 이 부분에서 2차원 배열을 만들어서 i, j 하나씩 세는 개념을 생각하는게 어려웠다.
#include<iostream>
using namespace std;
int main(){
int arr[101][101] = {0};
int a,b;//a는 색종이 왼쪽 변과 도화지 왼쪽 변 거리(행)
//b는 색종이 아래쪽 변과 도화지의 아래쪽 변 사이의 거리(열)
int num; //색종이 수
cin >> num;
int answer = 0;
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;
if( arr[i][j] = 1)
answer++;
}
cout << answer;
return 0;
}
다른 사람의 코드를 참고하고서 2차원 배열을 이용해서 문제를 풀었을 때 처음에는 전체 도화지의 범위를 생각하지 않고 다음과 같이 바로 칠해진 부분을 더해서 틀린 코드를 작성했었다.