Sena's garden

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

백준/C언어

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

paraam02 2024. 8. 16. 02:06

 

문제

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

 

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

 

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

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

 

 


 

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int colpaper;
	int row, col;
	int count = 0;
	int paper[100][100] = { 0 };

	scanf("%d", &colpaper);

	for (int i = 0; i < colpaper; i++) {
		scanf("%d %d", &row, &col);

		for (int j = 100 - (row + 10); j < 100 - row; j++) {
			for (int k = col; k < col + 10; k++) {
				paper[j][k] = 1;
			}
		}
	}

	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++) {
			if (paper[i][j] == 1)
				count++;
		}
	}

	printf("%d", count);

	return 0;
}

 

 


 

 

쉽게 생각해 보면, 100*100 크기의 이차원 배열에서 해당되는 범위의 칸만 색칠한 후 갯수를 세는 것과 같다. 한 칸의 넓이는 1*1 = 1 이므로 이것을 이용해 주어진 범위의 넓이를 구할 수 있다.

 

paper[100][100] 크기의 이차원 배열을 생성하고, 색칠된 곳들을 구분하기 위해 각 칸을 0으로 초기화 한다. 색종이의 갯수를 입력받은 후 for문을 이용해 색종이 마다 paper의 칸을 채우는 것을 반복한다.

 

우선 각 색종이의 시작 지점을 입력받는다. 입력받은 row와 col을 바탕으로 100에서 row+10을 뺀 위치를 i의 시작지점으로 설정한다. i는 100 - row인 지점까지 총 10칸을 범위로 지정하는 조건을 설정한다. 이중 for문을 이용하여 행에 따른 열의 위치와 값들도 조건을 이용해 조건에 해당하는 칸들을 1로 초기화한다. 색종이들이 겹치는 구간이 발생하더라도 결국 같은 1로 초기화 되는 것이기 때문에 문제가 발생하지 않는다.

 

두 번째 for문에서는 이중 for문을 이용해 색칠된 칸을 찾는다. if조건문을 이용하여 0이 아닌 1로 채워진 칸들을 찾아 count의 수를 1씩 증가시킨다. 마지막으로 count를 출력하여 문제를 해결한다.