-
반응형
https://www.acmicpc.net/problem/1926
1926번: 그림
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로
www.acmicpc.net
풀이
가장 기본적인 BFS문제이다. 그림을 만나면 해당 그림에 대한 BFS 탐색을 실시하며 넓이를 구해주고, 최대 넓이를 갱신해주면 된다.
시간복잡도
최악으로 모든 원소를 탐색하기 때문에 O(NM)이 된다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { static class Node{ int x,y; public Node(int x,int y){ this.x=x; this.y=y; } } public static boolean isIn(int[][] maze,int x,int y){ return 0<=x && x<maze.length &&0<=y && y<maze[x].length; } //넓이를 반환 public static int bfs(int[][] maze,boolean[][] visited,int x,int y){ Queue<Node> q = new LinkedList<>(); int[][] mv = new int[][]{{0,1},{0,-1},{1,0},{-1,0}}; int area = 1; q.offer(new Node(x,y)); visited[x][y]=true; while(!q.isEmpty()){ Node node = q.poll(); for(int i=0;i<4;i++){ int nx = node.x+mv[i][0]; int ny = node.y+mv[i][1]; if(isIn(maze,nx,ny) && !visited[nx][ny] && maze[nx][ny]==1){ q.offer(new Node(nx,ny)); visited[nx][ny]=true; area++; } } } return area; } 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.valueOf(st.nextToken()); int m = Integer.valueOf(st.nextToken()); int maze[][] = new int[n][m]; boolean[][] visited = new boolean[n][m]; for (int i = 0; i < n; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < m; j++) { maze[i][j] = Integer.valueOf(st.nextToken()); } } int count = 0; int maxArea = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if(!visited[i][j] && maze[i][j]==1){ maxArea = Math.max(maxArea,bfs(maze,visited,i,j)); count++; } } } System.out.println(count); System.out.println(maxArea); } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 18232번 텔레포트 경기장 (Java) (0) 2022.12.18 [백준OJ] 1793 타일링 (Java) (0) 2022.12.15 [백준OJ] 13022번 늑대와 올바른 단어 (0) 2022.12.06 [백준OJ] 13413번 오셀로 재배치 (0) 2022.12.05 [백준OJ] 1707번 이분 그래프 (2) 2022.12.05 댓글