반응형

문제 링크 : www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

>풀이

 

처음에는 영역 탐색? bfs로 풀면 바로 풀리겠네? 하고 풀다가 생각해보니 넓이를 구하는거는 dfs로 탐색하는게 구현이 편할 것 같더라고요. 그래서 dfs로 풀었습니다.

 

결과 값을 저장하고, 정렬해야하니, vector와 sort를 사용합시다 :)

 

아무 생각없이 visited배열을 visit로 이름짓고 풀다가 컴파일 에러났네요 ㅋㅋㅋ

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

int moveX[4] = {1, -1, 0, 0};
int moveY[4] = {0, 0, 1, -1};

int M, N, K;
int cnt;
int arr[101][101];
bool visited[101][101];
vector<int> res;

void dfs(int x, int y) {
        int nx, ny;

        visited[x][y] = true;
        cnt++;

        for (int i = 0; i < 4; i++) {
                nx = x + moveX[i];
                ny = y + moveY[i];

                if (nx >= 0 && ny >= 0 && nx < M && ny < N && !visited[nx][ny]) {
                        dfs(nx, ny);
                }
        }
}

int main(void) {
        scanf("%d %d %d", &M, &N, &K);
        for (int i = 0; i < K; i++) {
                int x1, x2, y1, y2;
                scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
                for (int j = y1; j < y2; j++) {
                        for (int k = x1; k < x2; k++) {
                                arr[j][k] = 1;
                                visited[j][k] = true;
                        }
                }
        }
        for (int i = 0; i < M; i++) {
                for (int j = 0; j < N; j++) {
                        if (arr[i][j] == 0 && visited[i][j] == false) {
                                cnt = 0;
                                dfs(i, j);
                                res.push_back(cnt);
                        }
                }
        }
        sort(res.begin(), res.end());
        
        int size = res.size();

        printf("%d\n", size);
        for (int i = 0; i < size; i++)
                printf("%d ", res[i]);

        return 0;
}

(개발 환경 : vs code)

반응형

'알고리즘 (백준) > BOJ 길라잡이 (1)' 카테고리의 다른 글

백준 2156 (포도주 시식) / C++  (0) 2020.11.05
백준 1912 (연속합) / C++  (0) 2020.11.05
백준 2636 (치즈) / C++  (0) 2020.10.14
백준 7569 (토마토) / C++  (1) 2020.10.07
백준 7576 (토마토) / C++  (0) 2020.10.07

+ Recent posts