문제링크 : https://www.acmicpc.net/problem/1926
아이디어
- BFS 사용해서 연결된 노드 구하기(Flood Fill)
- 전체 노드 순회하면서 체크 안되어있는 노드 발견할경우 BFS 수행
- 이떄마다 전체 그림 카운트 수 증가
- 그리고 그림 가장 넓은값 구하기
- 전체 노드 순회하면서 체크 안되어있는 노드 발견할경우 BFS 수행
시간복잡도 계산
- BFS : O(V+E)
- V : 모든 노드수 : O(NM)
- E : 노드에서 간선수 4방향 : O(4NM)
- N과 M 최대값이라고 가정시
- 총합 : O(5N^2)
- O(5*N^2) = 5 * 25e4 : 125e4 = 1.25e6
자료구조
- 그림 개수 cnt : 최대 N^2 = 25e4 : INT 가능
- 그림 최대 크기 maxv : 최대 N^2 = 25e4 : INT 가능
- BFS에서 사용하는 큐 queue<pair<int, int>>
코드(C++)
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <iostream> #include <queue> using namespace std; int map[510][510]; bool chk[510][510]; int dy[] = {0,1,0,-1}; int dx[] = {1,0,-1,0}; int N,M; int bfs(int y, int x) { int cnt=0; // 그림 크기 queue<pair<int, int>> q; q.push(make_pair(y, x)); chk[y][x] =1; while(!q.empty()) { auto eq = q.front(); q.pop(); int ey = eq.first; int ex = eq.second; cnt++; // 그림 크기 증가 for(int k=0; k<4; k++) { int ny = ey + dy[k]; int nx = ex + dx[k]; if(ny>=0 && ny < N && nx>=0 && nx < M) { if(map[ny][nx] == 1 && chk[ny][nx] == 0) { chk[ny][nx] = 1; q.push(make_pair(ny, nx)); } } } } return cnt; } int main() { ios::sync_with_stdio(0); cin.tie(0); fill(&chk[0][0], &chk[509][510], 0); cin >> N >> M; for(int j=0; j<N; j++) { for(int i=0; i<M; i++) { cin >> map[j][i]; } } int cnt=0; int maxv= 0; // 체크되어있지 않은 경우 bfs 수행 for(int j=0; j<N; j++) { for(int i=0; i<M; i++) { if(map[j][i] == 1 && chk[j][i] == false) { maxv = max(maxv, bfs(j,i)); cnt++; } } } cout << cnt << '\n'; cout << maxv << '\n'; return 0; } | cs |
문제유형
- BFS - Flood Fill
- 이어져있는 노드를 연결하는 문제
- BFS 사용해서, 이어져 있는 노드 확인
비슷한 문제
'알고리즘 > 백준' 카테고리의 다른 글
백준 4179 불! (0) | 2021.03.14 |
---|---|
백준 4485 녹색 옷 입은 애가 젤다지? (0) | 2021.03.14 |
백준 1038 감소하는 수 (0) | 2021.03.14 |
백준 9019 DSLR (0) | 2021.03.13 |
백준 1747 소수&팰린드롬 (0) | 2021.03.13 |