1926번: 그림
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로
www.acmicpc.net
[문제 풀이]
깊이 우선 탐색을 이용하여 문제를 풀었습니다.
이 문제는 2차원 배열에 대한 정보가 주어지고 2차원 배열에서 1로 연결된 그림의 갯수가 최대 그림의 크기를 찾는 문제였습니다. 문제를 푼 방법은 배열을 순회하며 1이 시작되는 좌표를 찾고 깊이 우선으로 탐색하며 확인한 좌표들은 마킹을 해주는 식으로 풀었습니다.
코드 설명
- 입력으로 주어진 값을 받아 배열에 저장해주고 방문을 확인할 배열을 똑같이 선언해 줍니다.
- 입력 받은 배열을 반복문을 통해 순회 하면서 방문하지 않았으면서 배열의 값이 1이라면 그림의 값을 1로 초기화 해주고 탐색을 시작해줍니다.
- 그림의 값이 현재의 최대 그림의 값보다 크면 최대 그림의 값을 바꿔줍니다.
- 탐색하는 배열의 좌표의 상하좌우의 값이 1이면서 방문하지 않았다면 그림의 크기를 키워주고 탐색합니다.
[코드]
import java.io.*;
import java.util.*;
class Main{
static int n, m, answer = 0, temp_square = 0;
static int[][] map;
static int[][] visit;
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
public static void DFS(int idx, int jdx) {
if(answer < temp_square)
answer = temp_square;
for(int i = 0; i < 4; i++) {
int nx = idx + dx[i];
int ny = jdx + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m || visit[nx][ny] == 1 || map[nx][ny] == 0)
continue;
temp_square++;
visit[nx][ny] = 1;
DFS(nx, ny);
}
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
visit = new int[n][m];
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < m; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int picture_cnt = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(visit[i][j] == 0 && map[i][j] == 1) {
visit[i][j] = 1;
temp_square = 1;
DFS(i,j);
picture_cnt++;
}
}
}
System.out.println(picture_cnt);
System.out.println(answer);
}
}
'algorithm > BOJ' 카테고리의 다른 글
백준 1463_1로 만들기(JAVA) (0) | 2021.04.22 |
---|---|
백준 1717_집합의 표현(JAVA) (0) | 2021.04.16 |
백준 2583_영역 구하기(JAVA) (0) | 2021.04.09 |
백준 17471_게리맨더링(C++) (0) | 2020.11.05 |
백준 2668_숫자고르기(C++) (0) | 2020.11.04 |