#include<stdio.h>
#include<stdlib.h>
void apart(int **map,int **visited, int mapsize,int*result,int* count,int i,int j)
{
//printf("now:%d %d\n", i, j);
//if (i + 1 < mapsize && j + 1 < mapsize && 0 < i - 1 && 0 < j - 1)
//{
if (i + 1 < mapsize)
{
if (visited[i + 1][j] == 0 && map[i + 1][j] == 1)
{
visited[i + 1][j] = 1;
result[count[0]]++;
apart(map, visited, mapsize, result, count, i + 1, j);
}
}
if (0 <= i - 1)
{
if (visited[i - 1][j] == 0 && map[i - 1][j] == 1)
{
visited[i - 1][j] = 1;
result[count[0]]++;
apart(map, visited, mapsize, result, count, i - 1, j);
}
}
if (j + 1 < mapsize)
{
if (visited[i][j + 1] == 0 && map[i][j + 1] == 1)
{
visited[i][j + 1] = 1;
result[count[0]]++;
apart(map, visited, mapsize, result, count, i, j + 1);
}
}
if (0 <= j - 1)
{
if (visited[i][j - 1] == 0 && map[i][j - 1] == 1)
{
visited[i][j - 1] = 1;
result[count[0]]++;
apart(map, visited, mapsize, result, count, i, j - 1);
}
}
//}
}
void ctoi(char* text, int *arr,int mapsize)
{
for (int i = 0; i < mapsize; i++)
{
arr[i] = text[i]-48;
}
}
void uparr(int* result, int num)
{
int tmp;
for (int i = 0; i < num; i++)
{
for (int j = 1; i + j < num; j++)
{
if (result[i] > result[i + j])
{
tmp=result[i];
result[i] = result[i + j];
result[i + j] = tmp;
}
}
}
}
int main()
{
int** map;
int** visited;
int mapsize;
scanf("%d", &mapsize);
char input[26];
map = malloc(sizeof(int*) * mapsize);
visited = malloc(sizeof(int*) * mapsize);
int result[650] = { 0 };
for (int i = 0; i < mapsize; i++)
{
scanf("%s", input);
visited[i] = malloc(sizeof(int) * mapsize);
map[i] = malloc(sizeof(int) * mapsize);
ctoi(input, map[i],mapsize);
for (int j = 0; j < mapsize; j++)
{
//printf("%d ", map[i][j]);
visited[i][j] = 0;
}
}
int count[1] = { 0 };
for (int i = 0; i < mapsize; i++)
{
for (int j = 0; j < mapsize; j++)
{
if (visited[i][j] == 0 && map[i][j] == 1)
{
apart(map, visited, mapsize, result, count, i, j);
//printf("out\n");
if (result[count[0]] == 0)
result[count[0]]++;
count[0]++;
}
}
}
printf("%d\n", count[0]);
uparr(result,count[0]);
for (int i = 0; i < count[0]; i++)
{
printf("%d\n", result[i]);
}
for (int i = 0; i < mapsize; i++)
{
free(map[i]);
free(visited[i]);
}
free(map);
free(visited);
}
BFS문제였는데 일단 상당히 더럽게 풀었다. 전역변수를 사용할 수 없는 42서울 특성상 최대한 함수 인자를 맞춰서 넣어봤다. 하지만 딱히 좋은 방법인 것 같지는 않지만 스스로 푼게 뿌듯한 문제!!
이 글은 코딩 꼬꼬마 시절에 푼 문제를 보관한 글로 네이버에 저장해둔 글을 옮긴 글입니다.
혹시나 참고하시는 부분에 이상한 부분이나 질문이 생긴다면 남겨주시면 친절히 답변 드리겠습니다.
728x90
'알고리즘 기초시절' 카테고리의 다른 글
백준 (C언어)백준 10828번 스택 스택 구현문제 (0) | 2023.01.04 |
---|---|
백준 (C언어)백준 DFS와 BFS문제 1260번 (0) | 2023.01.04 |
백준 2178 BFS미로탐색(C언어) (2) | 2023.01.04 |
백준 토마토 성공!! 1068번 BFS(C언어) (0) | 2023.01.04 |
백준 트리 1068번 DFS(C언어) (0) | 2023.01.04 |