250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dfs
- 코테
- 완전탐색
- 쉬운 알고리즘 문제
- 프로그래머스
- readingbook
- 직무면접
- MySQL
- englishbook
- 코테 준비
- the midnight library
- nightroutine
- sw expert
- 삼성
- sw expert academy
- BFS
- 알고리즘 문제
- 코테 대비
- D4
- swexpertacademy
- English
- 원서읽자
- 코딩테스트
- STUDYENGLISH
- 알고리즘
- SQL
- 원서
- PyQt
- 백준
- 원서읽기
Archives
- Today
- Total
시나브로
2583. 영역 구하기 본문
728x90
추천도 : 3 (풀어볼만한 문제이다.)
이 문제의 경우 전체탐색의 문제이다. 간단한 문제인거 같지만, 함정이 있어 조심해야된다.
함정은
- 데이터 그대로 인덱스로 사용하면 의도한 그림이 나오지 않는다. 이럴 경우, 1 6 14라는 답을 얻게된다.
- n m 를 행/열이라고 생각하여 사용하면 그림은 행/열이 바껴서 그려진다.
이것만 유의하면 손쉽게 풀 수 있는 문제이다.
만약 이 문제가 단순히 직사각형을 제외한 면적을 구하는 문제였다면, 굳이 100*100 배열을 선언하여 공간을 낭비하지 않을 수 있다. 직사각형의 정보를 받을 때, 면적을 계산하고 겹치는 부분이 있다면, 그 공간의 면접만 빼줘 직사각형의 모든 넓이를 구할 수 있다. 이를 전체면적에서 빼면 간단하게 짧은 시간에 구할 수 있다.
저는 map을 전체 탐색을 하면 BFS를 이용해서 동일한 공간을 계산해주었습니다.
#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include<queue>
#include <algorithm>
using namespace std;
int map[110][110] = { 0 };
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
int n, m, k;
vector<int> list;
void checking(int i, int j,int count) {
for (int k = 0; k < 4; k++) {
if (i + dx[k] >= 0 && i + dx[k] <m && j + dy[k] >= 0 && j + dy[k] <n) {
if (map[i + dx[k]][j + dy[k]] == 0) {
list[count]++;
map[i + dx[k]][j + dy[k]] = count;
checking(i + dx[k], j + dy[k], count);
}
}
}
}
int main() {
freopen("inp.inp", "r", stdin);
freopen("out.out", "w", stdout);
cin >> n >> m >> k;
for (int i = 0; i < k; i++) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
for (int k = x1; k <= x2-1; k++) {
for (int kk = y1; kk <= y2-1; kk++) {
map[k][kk] = -1;
}
}
}
list.push_back(0);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] == 0) {
list.push_back(1);
map[i][j] = list.size() - 1;
checking(i, j, list.size()-1);
}
}
}
cout << list.size()-1 << endl;
sort(list.begin(), list.end());
for (int i = 1; i < list.size(); i++)
cout << list[i] << " ";
return 0;
}
https://www.acmicpc.net/problem/2583
728x90
'알고리즘 > 백준' 카테고리의 다른 글
14891. 톱니바퀴 (0) | 2020.10.14 |
---|---|
14888. 연산자 끼워넣기 (0) | 2020.08.27 |
2573. 빙산 (0) | 2020.08.04 |
16954. 움직이는 미로 탈출 (0) | 2020.08.04 |
2636. 치즈 (0) | 2020.07.30 |
Comments