백준 2583 - 영역 구하기
Updated:
Java
2583 번 - 영역 구하기
문제
접근 방법
«««< HEAD
영역을 표시하는 것이 핵심인 문제였다.
왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값을 받아 반복문을 통해 범위만큼 1로 바꾸어 주어 영역을 표시해 주었다.
여기서 오른쪽 위 꼭짓점은 1씩 차감하는 것을 놓치면 안된다.
이후 BFS를 통해 넓이를 구하고, 그 넓이를 List에 저장 후 정렬하여 문제를 해결하였다.
335fb3027b7baa39619109abe387ef513d163f45
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, k, areaCnt;
static int[][] map;
static List<Integer> area;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
k = stoi(stk.nextToken());
<<<<<<< HEAD
map = new int[n][m];
=======
map = new int[n][m];
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
int y1, x1, y2, x2;
for(int idx = 0; idx < k; idx++) {
stk = new StringTokenizer(br.readLine());
x1 = stoi(stk.nextToken());
y1 = stoi(stk.nextToken());
x2 = stoi(stk.nextToken()) - 1;
y2 = stoi(stk.nextToken()) - 1;
<<<<<<< HEAD
=======
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
for(int i = y1; i <= y2; i++) {
for(int j = x1; j <= x2; j++) {
map[i][j] = 1;
}
}
}
<<<<<<< HEAD
=======
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
area = new ArrayList<Integer>();
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(map[i][j] == 0) {
area.add(BFS(i,j));
}
}
}
<<<<<<< HEAD
System.out.println(areaCnt);
Collections.sort(area);
for(int num : area)
System.out.print(num + " ");
br.close();
}
=======
System.out.println(areaCnt);
Collections.sort(area);
for(int num : area)
System.out.print(num + " ");
br.close();
}
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
// 주어진 범위 안에 있는가
public static boolean isIn(int y, int x){
if(y < 0 || y >= n || x < 0 || x >= m)
return false;
return true;
}
<<<<<<< HEAD
static int dy[] = {-1,1,0,0};
static int dx[] = {0,0,-1,1};
=======
static int dy[] = {-1,1,0,0};
static int dx[] = {0,0,-1,1};
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
private static int BFS(int y, int x) {
areaCnt++;
int count = 1;
Queue<int[]> queue = new LinkedList<int[]>();
queue.add(new int[] {y,x});
map[y][x] = 1;
<<<<<<< HEAD
=======
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
int[] q;
int ny,nx;
while(!queue.isEmpty()) {
q = queue.poll();
y = q[0];
x = q[1];
<<<<<<< HEAD
=======
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
for(int i = 0; i < 4; i++) {
ny = y + dy[i];
nx = x + dx[i];
if(isIn(ny,nx) && map[ny][nx] == 0) {
map[ny][nx] = 1;
count++;
queue.add(new int[] {ny,nx});
}
}
}
<<<<<<< HEAD
return count;
}
=======
return count;
}
>>>>>>> 335fb3027b7baa39619109abe387ef513d163f45
static int stoi(String str) {
return Integer.parseInt(str);
}
}