가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
처음에는 어렵게 생각해서 색종이끼리 겹치는 넓이를 구하고 여러 색종이가 한 번에 겹치는 부분은 더해주는 식으로 구하려고 했다. 이 로직은 들어오는 색종이의 갯수가 정해져있으면 구현가능하나 정해져있지 않으면 굉장히 어려워졌다. 다른 방법을 찾아보다 새로운 방법을 알아냈다.
시각적인 맵을 ‘0’으로 그리고 색종이가 들어오면 그 넓이만큼 ‘1’로 채운다. 그리고 마지막에 1의 갯수를 전부 세면 색종이가 붙은 전체 넓이가 나온다.
#include <stdio.h>
int main()
{
int arr[100][100] = {0,};
int a, b, n;
int cnt = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf ("%d %d", &a, &b);
for (int j = 0; j < 10; j++)
{
for (int k = 0; k < 10; k++)
{
arr[a + j][b + k] = 1;
}
}
}
for (int x = 0; x < 100; x++)
{
for (int y = 0; y < 100; y++)
{
if (arr[x][y] == 1)
cnt++;
}
}
printf("%d", cnt);
return (0);
}
어려운 식을 이용하는게 아니라 쉽게 시각적으로 표현하는 방법을 생각 못 해봤다. 문제를 여러가지 방법으로 고민해보는 능력을 키워야겠다.