CS/Algorithm

[백준:2667] 단지번호 붙이기 - JAVA

yujindonut 2021. 5. 2. 19:23
728x90

import java.util.*;

public class Main {

	static int N;
	static int map[][];
	static boolean visit[][];
	static int[] xArr = {-1,0,1,0};
	static int[] yArr = {0,1,0,-1};
	static int apartN;
	static int[] aparts = new int[25*25];
	
	public static void dfs(int x, int y) {
		
		visit[x][y] = true;
		//dfs가 호출이 될 때마다 apart부분이 증가가 됨!-->이부분 답지 봄
		aparts[apartN]++; 
		
		for(int i = 0; i < 4; i++) {
			int nx = x + xArr[i];
			int ny = y + yArr[i];
			
			if(checkLocation(nx,ny)) {
				dfs(nx,ny);
			}
		}
	}
	public static boolean checkLocation(int x, int y) {
		//범위 벗어나면
		if(x < 0 || x >= N || y < 0 || y >= N)	return false;
		//이미 방문한 노드거나 간선이 없는 경우
		if(visit[x][y] == true || map[x][y] != 1)	return false;
		
		return true;
	}
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		N = scan.nextInt();
		map = new int [N][N];
		visit = new boolean[N][N];
		
		for(int i = 0; i < N; i++) {
			String row = scan.next();
			for(int j = 0; j < N; j++) {
				map[i][j] = row.charAt(j) - '0';
			}
		}
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				if(map[i][j] == 1 && !visit[i][j]) {
					dfs(i,j);
					apartN++; //dfs가 호출이 될때마다 분리되어있는 부분
				}
			}
		}
		System.out.println(apartN);
		Arrays.sort(aparts); //배열을 정렬해주는 것
		for(int i = 0; i < aparts.length; i++) {
			if(aparts[i] != 0) // 처음에 초기화를 크게 해줘서
				System.out.println(aparts[i]);
		}	
		scan.close();
	}
}

static int[] xArr = {-1,0,1,0};
static int[] yArr = {0,1,0,-1}; 

이거를 이용해서 범위 벗어나는지 체크 해주는 부분은 계속 나오는 것 같다.

미로 탐색에서 쓴 개념 이번에도 똑같이 썼음

728x90