[BOJ] 2583 영역구하기

GirlFriend-Yerin·2020년 8월 24일
0

알고리즘

목록 보기
1/131

Note

프로그래머스에서 카카오 문제로 나왔던 문제랑 비슷한문제인데
정작 풀어보지 못했던게 아쉬워서 풀어본 문제..
문제로는 어피치랑 무지가 나왔던거 같은데 그 때에는 BFS를 잘 몰라서 못 풀었던 문제로 배우고 난 뒤에
다시 한번 풀 기회가 없을까 하던 도중에 발견해서 풀어본 문제

영상처리에서 Labeling과 유사하게 풀어보았다.

풀고나니 재밌다.

소스코드

#include <iostream>
#include <queue>

using namespace std;

int paper[100][100];
int checkMap[100][100];
int mSize[500];

struct Point
{
	int x, y;

	Point(int x, int y) : y(y), x(x) {}
};

int main()
{
	// m - row, n - col, k - count
	int m, n, k;
	int label = 1;
	queue q;

	cin >> m >> n >> k;

	for (int i = 0; i < k; i++)
	{
		int sx, sy, ex, ey; // start_x, start_y, end_x, end_y

		cin >> sx >> sy >> ex >> ey;

		for (int j = sx; j < ex; j++)
			for (int k = sy; k < ey; k++)
				paper[j][k] = 1;
	}

	// 4 - Connectivity Labeling
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (checkMap[j][i] == 0 && paper[j][i] == 0)
			{
				q.push(Point(i,j));
				checkMap[j][i] = label;

				while (!q.empty())
				{
					Point cur = q.front();
					q.pop();

					// Size Acc
					mSize[label - 1]++;

					// check Right
					if (checkMap[cur.y + 1][cur.x] == 0 && paper[cur.y + 1][cur.x] == 0 && cur.y+1 < n)
					{
						q.push(Point(cur.x, cur.y + 1));
						checkMap[cur.y + 1][cur.x] = label;
					}

					// check Bottom
					if (checkMap[cur.y][cur.x + 1] == 0 && paper[cur.y ][cur.x + 1] == 0 && cur.x+1 < m)
					{
						q.push(Point(cur.x + 1, cur.y));
						checkMap[cur.y][cur.x + 1] = label;
					}
					
					// check Left
					if (cur.y - 1 >= 0)
					{
						if (checkMap[cur.y - 1][cur.x] == 0 && paper[cur.y - 1][cur.x] == 0)
						{
							q.push(Point(cur.x, cur.y - 1));
							checkMap[cur.y - 1][cur.x] = label;
						}
					}

					// check Top
					if (cur.x - 1 >= 0)
					{
						if (checkMap[cur.y][cur.x - 1] == 0 && paper[cur.y][cur.x - 1] == 0)
						{
							q.push(Point(cur.x - 1, cur.y));
							checkMap[cur.y][cur.x - 1] = label;
						}
					}
				}

				// NextLabel Number;
				label++;
			}
		}
	}
	cout << label - 1 << endl;
	
	// Selection Sort
	for (int i = 0; i < label - 1; i++)
	{
		int max = i;
		for (int j = i; j < label - 1; j++)
		{
			if (mSize[max] > mSize[j])
				max = j;
		}
		swap(mSize[max], mSize[i]);
	}

	for (int i = 0; i < label-1; i++)
		cout << mSize[i] << " ";

	return 0;
}

2018-12-26 21:29:29에 Tistory에서 작성되었습니다.

profile
개발할때 가장 행복한 개발자입니다.

0개의 댓글