[백준/C언어] 2563번 색종이

EOH·2023년 2월 21일
0

백준

목록 보기
2/5
post-thumbnail

문제

가로, 세로의 크기가 각각 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);
}

p.s.

어려운 식을 이용하는게 아니라 쉽게 시각적으로 표현하는 방법을 생각 못 해봤다. 문제를 여러가지 방법으로 고민해보는 능력을 키워야겠다.

profile
에-오

0개의 댓글