반응형
🔺 문제
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오
www.acmicpc.net
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import java.util.*;
import java.io.*;
public class Main {
static int[] dx = {0,0,-1,1};
static int[] dy = {1,-1,0,0};
static int M, N, K, cnt;
static int[][] map;
static PriorityQueue<Integer> list = new PriorityQueue<>(); // 각 영역 넓이 저장 리스트
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int[M][N];
while(K --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
// 🔔 직사각형이 만들어지는 영역은 방문 처리 🔔
for(int j = y1 ; j < y2 ; j++) {
for(int i = x1 ; i < x2 ; i++) {
map[j][i] = -1;
}
}
}
for(int i = 0 ; i < M ; i++) {
for(int j = 0 ; j < N ; j++) {
if(map[i][j] == 0) {
bfs(i, j);
cnt++;
}
}
}
sb.append(cnt).append("\n");
while(!list.isEmpty()) {
sb.append(list.poll()).append(" ");
}
System.out.println(sb);
}
private static void bfs(int a, int b) {
if(map[a][b] != 0) return;
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {a,b});
map[a][b] = -1; // 방문 표시
int area = 0;
while(!queue.isEmpty()) {
int[] now = queue.poll();
area++; // 영역 넓이 + 1
for(int d = 0 ; d < 4 ; d++) {
int nx = now[0] + dx[d];
int ny = now[1] + dy[d];
if(nx < 0 || ny < 0 || nx >= M || ny >= N || map[nx][ny] == -1) continue;
queue.add(new int[] {nx, ny});
map[nx][ny] = -1; // 방문 표시
}
}
list.add(area); // 넓이 리스트에 각 영역 넓이 추가
}
}
|
cs |
✅ 해결 아이디어
✔ BFS / DFS
- 각 영역의 넓이들을 저장할 리스트를 우선순위 큐로 만들어 자동 오름차순 정렬하게 했다.
(그냥 list.sort(null) 이나 Collections.sort(list) 해도 된다.)
💥 유의사항
• Line 32-36 ⇨ for문 j, i 순서 주의해야 한다... (y 먼저 !)
🔺 다른 풀이들
- DFS 풀이
https://www.acmicpc.net/source/56170643
💬 느낀 점
cnt 안 구하고 list.size() 출력해도 됨!!
32-36번째 줄.. x랑 y 순서 바꿔서 해서 계속 틀렸었음...ㅠ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔
https://dding9code.tistory.com/6
[백준 2583] - 영역 구하기(JAVA)
[문제] 출처 - https://www.acmicpc.net/problem/2583 2583번: 영역 구하기 첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한
dding9code.tistory.com
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 11722번: 가장 긴 감소하는 부분 수열 (0) | 2023.07.20 |
---|---|
[백준/JAVA] 11055번: 가장 큰 증가하는 부분 수열 (0) | 2023.07.20 |
[백준/JAVA] 2644번: 촌수계산 (0) | 2023.07.19 |
[백준/JAVA] 1182번: 부분수열의 합 (0) | 2023.07.18 |
[백준/JAVA] 10451번: 순열 사이클 (0) | 2023.07.18 |