출처
https://www.acmicpc.net/problem/1926
1926번: 그림
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로
www.acmicpc.net
문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.
입력
첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)
출력
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.
입출력 예제

내코드
그림 개수와 가장 크기 큰 그림 너비 찾기 문제입니다.
전형적인 bfs 문제로 범위 체크를 먼저 해주는 것이 좋습니다.
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int M;
static int mat[][];
static boolean visit[][];
static int drawCnt = 0;// 그림 개수
static int max = 0;// 가장 넓은 그림 넓이
static Queue<Node> queue;
// 상하좌우 좌표
static int dx[] = { 1, 0, -1, 0 };
static int dy[] = { 0, 1, 0, -1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
mat = new int[N][M];
visit = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
mat[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
//방문해야하지만 아직 방문 안한곳만 bfs
if (visit[i][j] == false && mat[i][j] == 1) {
bfs(i, j);
}
}
}
System.out.println(drawCnt);
System.out.println(max);
}
public static void bfs(int x, int y) {
queue = new LinkedList<>();
//현재 위치 넣기
queue.offer(new Node(x, y));
//그림 크기를 셀 count
int count = 0;
while (!queue.isEmpty()) {
Node node = queue.poll();
for (int j = 0; j < 4; j++) {
int nx = node.x + dx[j];
int ny = node.y + dy[j];
//범위 판단
if (nx < 0 || nx >= N || ny < 0 || ny >= M) {
continue;
}
//방문 했거나, 방문안해도 되는 곳 패스
if (visit[nx][ny] == true || mat[nx][ny] == 0) {
continue;
}
//방문 표시하고 큐에 넣기
visit[nx][ny] = true;
queue.offer(new Node(nx, ny));
}
count++;
}
// 그림 개수 +1
drawCnt++;
if (count > 1) {
count--;
}
max = Math.max(max, count);
}
}
class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}'알고리즘 공부 > 백준' 카테고리의 다른 글
| [백준] 7576번 토마토 (0) | 2021.10.27 |
|---|---|
| [백준] 2178번 미로 탐색 (0) | 2021.10.26 |
| [백준] DFS와 BFS (0) | 2021.10.23 |
| [백준] 13458번 시험 감독 (0) | 2021.10.22 |
| [백준] 1874번 스택 수열 (0) | 2021.10.10 |