본문 바로가기
[백준]

[BaekJoon/백준] 2583번 영역 구하기

by Hevton 2022. 6. 24.
반응형

 

19시에 자버렸고,, 22:30분에 눈을 떴다.. 생활패턴 망했네.

 

 

이 문제를 풀 땐, x축 기준으로 뒤집어서 배열 상으로 생각하여 풀었다.

시간복잡도는 dfs => O(n) x n^2 = O(n^3) 정도 나오는데, 사실 이정도는 안나올 것 같다.


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int Arr[100][100];
int N, M, K;

int mx[4] = {-1, 1, 0, 0};
int my[4] = {0, 0, -1, 1};

int COUNT;
vector<int> T;
int T_SIZE;

void dfs(int x, int y) {
    
    Arr[x][y] = 1;
    COUNT++;
    
    int xx, yy;
    
    for(int i = 0; i < 4; i++) {
        xx = x + mx[i];
        yy = y + my[i];
        
        if(xx < 0 || xx >= N || yy < 0 || yy >= M)
            continue;
        
        if(Arr[xx][yy] == 0)
            dfs(xx, yy);
    }
    
}

int main() {
    
    int sx, sy, ex, ey;
    
    cin >> N >> M >> K;
    
    // 예시 그림을 x축 대칭으로 뒤집어서 생각. 배열상으로.
    
    for(int i = 0; i < K; i++) {
        
        cin >> sy >> sx >> ey >> ex; // 입력을 이렇게 변환
        
        
        for(int i = sx; i < ex; i++) {
            
            for(int j = sy; j < ey; j++) {
                
                Arr[i][j] = 1;
            }
        }
    }
    
    
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            
            if(Arr[i][j] == 0) {
                COUNT = 0;
                dfs(i, j);
                T.push_back(COUNT);
            }
        }
    }
    
    
    sort(T.begin(), T.end());
    cout << (T_SIZE = T.size()) << "\n";
    
    for(int i = 0; i < T_SIZE; i++)
        cout << T[i] << " ";
    
    
}
반응형

'[백준]' 카테고리의 다른 글

[BaekJoon/백준] 14502번 연구소  (0) 2022.06.24
[BaekJoon/백준] 2636번 치즈  (0) 2022.06.24
[BaekJoon/백준] 11048번 이동하기  (0) 2022.06.23
[BaekJoon/백준] 11403번 경로 찾기  (0) 2022.06.23
[BaekJoon/백준] 1026번 보물  (0) 2022.06.22