728x90
오늘의 문제는 백준
2583번 영역 구하기
문제
문제 설명
M x N 크기의 모눈 종이 안에 세 개의 직사각형이 들어있습니다. 이 때 직사각형을 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어지고 그 영역의 넓이가 얼마인지 구하는 문제입니다.
[입력]
첫 번째 줄 : 100 이하의 자연수 M, N, k가 빈 칸을 사이에 두고 차례로 주어집니다.
다음 줄 : 직사각형의 왼쪽 아래 꼭지점의 x, y 좌표값과 오른쪽 꼭지점의 x,y 좌표값이 빈 칸을 사이에 두고 주어집니다.
[출력]
첫째 줄 : 분리되어 나누어지는 영역의 개수를 출력합니다.
둘째 줄 : 각 영역의 넓이를 오름차순으로 정렬하여 빈칸을 사이에 두고 출력합니다.
[입력 예시]
5 7 3
0 2 4 4
1 1 2 5
4 0 6 2
[출력 예시]
3
1 7 13
문제 풀이 시간
권장 풀이 시간은 60분이었고, 저는 60분이 걸렸습니다.
문제 접근 방식
먼저 입력받은 모눈종이를 나타낼 2차원 배열 map을 생성하고 초기 값을 0으로 초기화합니다. 입력 받은 직사각형의 시작 좌표와 끝 좌표까지의 범위를 1로 채웁니다. 모눈 종이를 순회하며 값이 0인 칸이 발견되면 BFS 알고리즘을 사용해 연결된 모든 빈 칸을 탐색하고 넓이를 계산해 리스트에 추가합니다.
문제 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main
{
private static int M, N, k;
private static int startX, startY, endX, endY;
private static int[][] map;
public static void square(int x1, int y1, int x2, int y2) {
for(int i = y1; i < y2; i++) {
for(int j = x1; j < x2; j++) {
map[i][j] = 1;
}
}
}
public static int bfs(int m, int n) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{m, n});
map[m][n] = 1;
int blank = 1;
int[] dx = {0, 0, -1, 1};
int[] dy = {-1, 1, 0, 0};
while(!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[0];
int y = current[1];
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < M && ny >= 0 && ny < N && map[nx][ny] == 0) {
queue.add(new int[]{nx, ny});
map[nx][ny] = 1;
blank++;
}
}
}
return blank;
}
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];
for(int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
startX = Integer.parseInt(st.nextToken());
startY = Integer.parseInt(st.nextToken());
endX = Integer.parseInt(st.nextToken());
endY = Integer.parseInt(st.nextToken());
square(startX, startY, endX, endY);
}
List<Integer> answer = new ArrayList<>();
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
if(map[i][j] == 0) {
answer.add(bfs(i, j));
}
}
}
Collections.sort(answer);
System.out.println(answer.size());
for(int answers : answer) {
System.out.print(answers + " ");
}
}
}
이렇게 오늘 35일차 TIL을 작성해 보았습니다.
728x90
'🍪 Ect > #Study' 카테고리의 다른 글
[99클럽 코테 스터디] 37일차 TIL 완전 탐색 (0) | 2024.08.27 |
---|---|
[99클럽 코테 스터디] 36일차 TIL 완전탐색 (0) | 2024.08.26 |
[99클럽 코테 스터디] 34일차 TIL DFS/BFS (0) | 2024.08.24 |
[99클럽 코테 스터디] 33일차 TIL DFS/BFS (0) | 2024.08.23 |
[99클럽 코테 스터디] 32일차 TIL DFS/BFS (0) | 2024.08.22 |
댓글