본문 바로가기
코딩 테스트

2667번 단지번호붙이기(자바, java) - DFS

by 주용사 2023. 1. 9.
728x90
import java.io.*;
import java.util.*;

public class Main {

	public static int count = 0;
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken());

		int[][] matrix = new int[n][n];
		boolean[][] visited = new boolean[n][n];
		for(int ii = 0 ; ii < n ; ii++)
		{
			String parsing = br.readLine();
			for(int jj = 0 ; jj < n ; jj++)
				matrix[ii][jj] = parsing.charAt(jj) - '0';
		}

		/* 파싱잘되었나 확인
		for(int ii = 0 ; ii < n ; ii++)
		{
			for(int jj = 0 ; jj < n ; jj++)
				System.out.print(matrix[ii][jj]);
			System.out.println();	
		}
		*/
		
		int result = 0;
		
		ArrayList<Integer> list_count = new ArrayList<>();
		
		for(int ii = 0 ; ii < n ; ii++)
		{
			for(int jj = 0 ; jj < n ; jj++)
			{
				if(dfs(n, ii, jj, matrix, visited))
				{
					result+=1;
					list_count.add(count); /* 정렬이 필요해서 리스트에 넣는다 */
					count = 0;
				}
			}
		}
		
		// 오름차순 정렬
		Collections.sort(list_count);
		
		// answer
		System.out.println(result);
		
		for(int ii = 0 ; ii < list_count.size(); ii++)
			System.out.println(list_count.get(ii));
	
		br.close();
		
	}
	
	public static boolean dfs(int n, int x, int y, int[][] matrix, boolean[][] visited)
	{
		/* 행렬내에 갈수 없는 곳들 */
		if(x < 0 || x >= n || y < 0 || y >= n)
			return false;
		
		/* 같은 영역이면서 방문하지 않았다 */ 
		if(matrix[x][y] == 1 && visited[x][y] == false )
		{
			
			visited[x][y] = true; /* 방문처리 */
			count++; /* 아파트개수 체크 */
			
			/* 영역을 확장해가는 느낌 */
			dfs(n, x-1, y, matrix, visited); /* up */
			dfs(n, x+1, y, matrix, visited); /* down */
			dfs(n, x, y+1, matrix, visited); /* right */
			dfs(n, x, y-1, matrix, visited); /* left */
			
			return true;
		}
		else
			return false;
	}
}

https://www.acmicpc.net/problem/2667

728x90