상세 컨텐츠

본문 제목

[C언어/DFS] 2667 : 단지번호붙이기

프로그래밍/백준

by whave 2022. 1. 4. 13:37

본문

#include<stdio.h>
#include<stdlib.h>
int arr[30][30]={0,};
int visited[30][30]={0,};
int index=0;
int count[500]={0};
void dfs(int i,int k){
	//printf("i=%d k=%d index=%d count[index]=%d\n",i,k,index,count[index]);
	visited[i][k]=1;
	count[index]++;
	if(arr[i][k-1]==1&&visited[i][k-1]==0)
		dfs(i,k-1);
	if(arr[i][k+1]==1&&visited[i][k+1]==0)
		dfs(i,k+1);
	if(arr[i-1][k]==1&&visited[i-1][k]==0)
		dfs(i-1,k);
	if(arr[i+1][k]==1&&visited[i+1][k]==0)
		dfs(i+1,k);
	
}

int compare(const void *a, const void *b)    // 오름차순 비교 함수 구현
{
    int num1 = *(int *)a;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
    int num2 = *(int *)b;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
    if (num1 < num2)    // a가 b보다 작을 때는
        return -1;      // -1 반환
    if (num1 > num2)    // a가 b보다 클 때는
        return 1;       // 1 반환
    return 0;    // a와 b가 같을 때는 0 반환
}

int main(void){
	int n;
	char ch;
	scanf("%d ",&n);

	for(int i=1;i<=n;i++){
		for(int k=1;k<=n;k++){
			ch=getchar();
			arr[i][k]=ch-48;
		}
		getchar();
	}
	
	for(int i=1;i<=n;i++){
		for(int k=1;k<=n;k++){
			if(arr[i][k]==1&&visited[i][k]==0){
				dfs(i,k);
				index++;
			}	
		}
	}
	
	qsort(count,index,sizeof(int),compare);
	printf("%d\n",index);
	for(int i=0;i<index;i++)
		printf("%d\n",count[i]);
	
	return 0;
}

 

배열 입력받을 때 숫자가 아니라 문자로 입력받아야 됐다

'프로그래밍 > 백준' 카테고리의 다른 글

1157 : 단어 공부  (0) 2022.01.06
[C언어/DFS] 4963 : 섬의 개수  (0) 2022.01.05
2606 : 바이러스  (0) 2022.01.04
1065 : 한수  (0) 2022.01.03
4673 : 셀프 넘버  (0) 2022.01.03

관련글 더보기