티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 2563번 색종이

https://www.acmicpc.net/problem/2563

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

가로, 세로 크기가 100인 정사각형 흰 도화지에

가로, 세로 크기가 10인 정사각형 검정 색종이를 n번 붙임

색종이를 붙인 후 검은 영역의 넓이를 출력

 

2. 풀이

개인적으로 '구현' 보다는 '문제 및 입력에 대한 이해' 가 어려운 문제 같습니다.

 

1) 문제

100 × 100 공간(흰색)에 10 × 10 색종이(검은색)를 붙일건데,

색종이를 n 번 붙인 후 검은 영역을 출력하면 되는 문제입니다.

공간과 색종이의 크기가 고정이므로 구현하기가 어렵지는 않습니다.

 

2) 입력

입력 값은 먼저 몇 번 반복할지(n)가 주어지고

그 후에 검은 색종이의 시작 위치가 n번 주어집니다.

 

예를 들어 3 7 이라고 주어지는 색종이는

3부터 13까지, 7부터 17까지의 공간에 놓여지게 됩니다.

 

3) 구현

구현 편의를 위해 문제의 예시 그림에서 x축 대칭된 상태로 가정하고 풀었습니다.

(일반적인 2차원 배열의 형태로 가정)

 

우선 100 × 100 짜리 map 을 선언하고 전부 0으로 초기화합니다.

그 후 검은 색종이가 놓여지는 위치를 모두 1로 변경합니다.

 

참고로 검은 영역이 중복되더라도 다르게 처리할 필요가 없으므로

기존 값이 0(흰색)이든 1(검은색)이든 무엇이든 1로 변경하면 됩니다.

 

이를 n번 반복한 뒤 map 전체를 돌면서

1의 개수를 확인한 뒤 그대로 출력하면 검은 영역의 넓이가 나옵니다.

 

3. 코드

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
2563_색종이
1152kb	0ms
*/
#include <cstdio>

const int LM = 100;
int map[LM][LM];

int main() {
#ifdef _WIN32
	freopen("input.txt", "r", stdin);
#endif // _WIN32
	int n, sx, sy;
	scanf("%d", &n);

	while (n--) {
		scanf("%d %d", &sx, &sy);
		for (int y = 0; y < 10; ++y) {
			for (int x = 0; x < 10; ++x) {
				map[sy + y][sx + x] = 1;
			}
		}
	}

	int cnt = 0;
	for (int y = 0; y < LM; ++y) {
		for (int x = 0; x < LM; ++x) {
			cnt += map[y][x];
		}
	}

	printf("%d\n", cnt);
	return 0;
}

* 전역 변수로 선언한 int 배열은 모든 값이 0 으로 초기화됩니다.

728x90
반응형
댓글