본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 1926/c++] 그림

by tokkiC 2022. 8. 7.

BFS 의 대표 기본 문제

칠해졌는지 아닌지를 판단하기 위해 2차원 보드에 값을 넣어 확인하고

이전에 방문 여부를 위해 보드 크기만큼의 visited 배열을 만들어 확인,

이동 가능 하다면 그 좌표를 큐에 넣고, 방문제크 한 후

큐에서 좌표를 하나씩 빼가며, 뺀 것을 체크할 현재 좌표라 하고, 현재 좌표에 이동가능한 상하좌우 범위를

2개의 배열을 사용해서 이동 후의 4개의 좌표 값을 구현, 이동 후의 좌표 값이

범위 밖이거나, 칠해지지 않았는지의 예외 조건이 아니라면 그 예상 좌표를 방문처리하고 큐에 넣어

계속 진행해나간다

그림의 수는 전체 2차원 보드를 이중 for문으로 하나씩 돌며, 칠해졌는데 방문하지 않은 것들을 위의 과정으로

체크해나가면서 파악하면 된다. 칠해진 영역의 수는 BFS 중에 큐에 들어가는 수를 세기만 하면 된다

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

 

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;

	int board[504][504];
	bool visited[504][504];
	int n, m;
	int dx[4] = {-1, 1, 0, 0};
	int dy[4] = {0, 0, -1, 1};

int main(){
	
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	int paints_num = 0;
	int max_area = 0;
	
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> board[i][j];
		}
	}
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (board[i][j] == 0 || visited[i][j])
			{
				continue;
			}
			paints_num++;
			queue<pair<int, int>> Q;
			visited[i][j] = 1;
			Q.push({i, j});
			int area = 0;
			while (!Q.empty())
			{
				area++;
				pair<int, int> current;
				current = Q.front();
				Q.pop();
				for (int direction = 0; direction < 4; direction++)
				{
					int nx = current.first + dx[direction];
					int ny = current.second + dy[direction];
					if (nx < 0 || nx >= n || ny < 0 || ny >= m)
					{
						continue;
					}
					if (visited[nx][ny] || board[nx][ny] != 1)
					{
						continue;
					}
					visited[nx][ny] = 1;
					Q.push({nx, ny});
				}
			}
			max_area = max(max_area, area);
		}
	}
	cout << paints_num << '\n' << max_area;
	
	return 0;
}

'개발 노트 > 백준, 프로그래머스 풀이' 카테고리의 다른 글

[백준 7576/c++] 토마토  (0) 2022.08.09
[백준 2178/c++] 미로 탐색  (0) 2022.08.08
[백준 1406/c++] 에디터  (0) 2022.08.06
[백준 10816/c++] 숫자 카드 2  (0) 2022.08.05
[백준 9663/c++] N-Queen  (0) 2022.08.04

댓글