본문 바로가기
백준/탐색(BFS, DFS)

백준 2583번 영역 구하기

by 기초백과 2021. 1. 14.

www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

아침에 일어나서 손 풀기, 뇌 풀기로 풀어봤던 문제입니다!

너무나 기본적인 너비 우선 탐색 문제였네요~~

나눠진 구역들의 갯수를 구하는 부분은 여러 문제에서

응용되는 것 같으니 기억해두는 편이 좋겠네요ㅎ

 

구현한 부분은 다음과 같습니다.

  • 네모 그리기
  • 네모로 인해 나눠진 구역의 갯수 구하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class GetDomain2583 {
	int height, width, rectNum;
	Rectangle[] rectArray;
	ArrayList<Integer> rectSize = new ArrayList<>();
	int[][] map;
	boolean[][] isNotVisited;
	Queue<Point> pointQueue = new LinkedList<>();
	Point[] bfsPoint = {new Point(-1, 0), new Point(1, 0), new Point(0, -1), new Point(0, 1)};  
	
	public class Point{
		int x, y;
		public Point(int y, int x) {
			// TODO Auto-generated constructor stub
			this.y = y;
			this.x = x;
		}
	}
	
	public class Rectangle{
		int a, b, c, d;
		public Rectangle(int a, int b, int c, int d) {
			// TODO Auto-generated constructor stub
			this.a = a;
			this.b = b;
			this.c = c;
			this.d = d;
		}
	}
	
	public void setNum() {
		int i, a, b, c, d;
		try {
			BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
			StringTokenizer st = new StringTokenizer(bf.readLine());
			
			height = Integer.parseInt(st.nextToken());
			width = Integer.parseInt(st.nextToken());
			rectNum = Integer.parseInt(st.nextToken());
			
			rectArray = new Rectangle[rectNum];
			map = new int[height][width];
			isNotVisited = new boolean[height][width];

			for(i=0; i<height; i++)
				Arrays.fill(isNotVisited[i], true);
			
			for(i = 0; i<rectNum; i++) {
				st = new StringTokenizer(bf.readLine());
				a = Integer.parseInt(st.nextToken());
				b = Integer.parseInt(st.nextToken());
				c = Integer.parseInt(st.nextToken());
				d = Integer.parseInt(st.nextToken());
				
				rectArray[i] = new Rectangle(a, b, c, d);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	public void drawRect() {
		int i, j, k;
		Rectangle rect;
		
		for(k =0 ;k <rectArray.length; k++) {
			rect = rectArray[k];
			for(i = rect.a; i< rect.c; i++) {
				for(j = rect.b; j<rect.d; j++) {
					map[j][i] = 1;
				}
			}
		}
		
		/*for(i=0; i<height; i++) {
			for(j=0; j<width; j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();*/
	}
	
	public void bfsRect(int y, int x) {
		int i, size = 1, nowX, nowY;
		Point nowPoint;
		isNotVisited[y][x] = false;
		pointQueue.add(new Point(y, x));
		
		while(!pointQueue.isEmpty()) {
			nowPoint = pointQueue.remove();
			
			for(i = 0; i< 4; i++) {
				nowX = nowPoint.x + bfsPoint[i].x;
				nowY = nowPoint.y + bfsPoint[i].y;
				
				if(nowX >= 0 && nowX < width) {
					if(nowY >= 0 && nowY < height) {
						if(map[nowY][nowX] == 0 && isNotVisited[nowY][nowX]) {
							isNotVisited[nowY][nowX] = false;
							pointQueue.add(new Point(nowY, nowX));
							size++;
						}
					}
				}
			}
		}
		
		rectSize.add(size);
	}
	
	
	/*public static void main(String[] args) {
		int i, j;
		GetDomain2583 main =new GetDomain2583();
		main.setNum();
		main.drawRect();
		
		for(i= 0; i< main.height; i++) {
			for(j=0; j<main.width; j++) {
				if(main.map[i][j] == 0 && main.isNotVisited[i][j])
					main.bfsRect(i, j);
			}
		}
		main.rectSize.sort(Comparator.naturalOrder());
		
		System.out.println(main.rectSize.size());
		for(int sizes : main.rectSize)
			System.out.print(sizes + " ");	
	}*/
}

반성할 점

  • 네모 그리기가 입력 받으면서 바로 할 수 있었다...(다른 사람 코드를 보니)
  • 입력 받으며 바로 할 수 있는 것들은 바로 하기!

 

'백준 > 탐색(BFS, DFS)' 카테고리의 다른 글

백준 14500 테트로미노  (0) 2021.01.20
백준 11559번 PuyoPuyo  (0) 2021.01.17
백준 2636, 2638번 치즈  (0) 2021.01.14
백준 2468번 안전 영역  (0) 2021.01.14
백준 14502번 연구소  (0) 2021.01.13