c c++ 언어 공부
백준 1926번 : 그림(C 언어)
Code C
2023. 9. 7. 12:38
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#include <stdio.h>
int arr[501][501] = { 0, };
int n, m;
int check[501][501] = { 0, };
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
int num = 0;
int max = 0;
void dfs(int y, int x)
{
num += 1;
check[y][x] = 1;
for (int k = 0; k < 4; k++)
{
int x_n = x + dx[k];
int y_n = y + dy[k];
if (arr[y_n][x_n] == 1 && x_n >= 0 && x_n < m && y_n >= 0 && y_n < n && check[y_n][x_n] == 0)
{
dfs(y_n, x_n);
}
}
}
int main() {
scanf("%d %d", &n, &m);
int i, j;
int count = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (arr[i][j] == 1 && check[i][j] == 0)
{
num = 0;
dfs(i, j);
count++;
}
if (num > max)
{
max = num;
}
continue;
}
}
printf("%d\n%d", count, max);
}
|
cs |
문제 설명: 이 문제는 주어진 도화지에 그려진 그림을 분석하는 문제입니다. 각 그림은 1로 연결된 영역을 의미하며, 그림의 개수와 그 중 가장 넓은 그림의 넓이를 구해야 합니다. 그림은 1로 연결된 영역을 의미하며, 가로나 세로로 연결된 영역은 하나의 그림으로 간주합니다. 대각선으로 연결된 영역은 별도의 그림으로 처리합니다.
코드 설명:
- 먼저, 입력으로 도화지의 세로 크기(n)와 가로 크기(m)를 받습니다.
- 2차원 배열 arr에 도화지의 정보를 저장합니다. 각 칸은 0 또는 1로 표시되며, 0은 색칠이 안 된 부분을 나타내고, 1은 색칠된 부분을 나타냅니다.
- 그림의 개수를 세는 count 변수와 현재 그림의 넓이를 저장하는 num 변수, 그리고 최대 그림 넓이를 저장하는 max 변수를 초기화합니다.
- 이중 반복문을 사용하여 도화지를 순회하면서 그림의 개수와 넓이를 구합니다.
- 만약 현재 위치가 색칠된 부분(1)이고, 아직 방문하지 않았다면, DFS(깊이 우선 탐색)를 수행하여 현재 그림의 넓이를 구합니다.
- DFS 함수에서는 현재 위치를 방문했음을 체크하고, 상하좌우로 인접한 위치를 확인하며 연결된 부분을 찾습니다. 연결된 부분을 찾으면 해당 위치로 이동하여 DFS를 재귀적으로 호출합니다.
- 그림을 하나 처리할 때마다 count를 증가시키고, 현재 그림의 넓이(num)가 최대 넓이(max)보다 크다면 max를 업데이트합니다.
- 모든 위치를 순회하면서 위 과정을 반복하고, 마지막에 그림의 개수와 최대 그림 넓이를 출력합니다.