백준 2563 색종이

Problem : 색종이

유형 : 구현


문제 설명

그림

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

예제 입력

1
2
3
4
3
3 7
15 7
5 2

예제 출력

1
260

해결 전략

색종이가 차지하고 있는 공간의 수를 센다.
도화지가 회전하여도 어차피 모양은 똑같다.
즉, 색종이 붙어있는 도화지의 모습은 예제와 완전히 동일하지 않아도 괜찮다.

주의할 점

  • 도화지 모양에 얽매이지 말자.

풀이

색종이를 배치할 좌표를 입력받는 함수.

도화지가 돌아간 모양이어도, 색종이가 차지하는 면적은 항상 같다.

색종이가 붙어 있는 공간의 개수를 세는 함수

받은 좌표에서 가로 세로를 10만큼씩 총 100개의 공간을 탐색한다.
이때 이미 탐색했던 공간이면 건너뛰고,
아니라면
해당 공간에 탐색완료 표시를 해두고, 색종이가 붙어 있는 공간의 개수를 증가시킨다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>
using namespace std;
bool board[101][101];
int n;
int answer;

void solve(int nx, int ny) {
	for (int i = nx; i < nx + 10; ++i) {
		for (int ii = ny; ii < ny + 10; ++ii) {
			if (board[i][ii])continue;
			board[i][ii] = true;
			answer++;
		}
	}
}

void input() {
	cin >> n;

	int nx, ny;
	while (n--) {
		cin >> ny >> nx;
		solve(nx, ny);
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
    //freopen("input.txt", "r", stdin);

	input();
	cout << answer;

	return 0;
}

피드백

없음