본문 바로가기
코딩테스트_백준풀이

C++ 2563 색종이

by wanna_dev 2023. 7. 12.

 

문제

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

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

예제 입력 1 

3
3 7
15 7
5 2

예제 출력 1 

260

첫번째로 들었던 생각은, 나에게 주어진 검은색 색종이의 크기가 100인 것을 활용해보려고 했다.

좌표 3개를 입력받으면 우선 300이겠고 겹치는 부분의 처리를 하려고 시도했다.

처리 중, 분기가 복잡해져서 다른 처리방법이 있는지 생각해보다가 결국 하나의 도화지에 색종이를 아무리 붙여도 한번만 카운트 해주면 되기 때문에, 1을 표시하는 방식으로 할 수 있겠다는 것을 깨닳았다.

 

그리고 1로 표시된 곳의 개수를 세면 된다.

#include <iostream>


using namespace std;


int arr[2];
int board[100][100];
int main() {
	int n;
	cin >> n;
	int sum = 0;
	for (int i = 0; i < n; i++) {
		cin >> arr[0];
		cin >> arr[1];

		for (int j = arr[0]; j < arr[0] + 10; j++) {
			for (int k = arr[1]; k < arr[1] + 10; k++)
				board[k][j] = 1;
		}
	}
	for(int i=0;i<100; i++)
		for (int j = 0; j < 100; j++) {
			sum += board[j][i];
	}

	cout << sum;
	return 0;
}