반응형
문제 링크 : 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 |