문제

상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 친구의 친구를 초대하기로 했다. 상근이의 동기는 모두 N명이고, 이 학생들의 학번은 모두 1부터 N까지이다. 상근이의 학번은 1이다.

상근이는 동기들의 친구 관계를 모두 조사한 리스트를 가지고 있다. 이 리스트를 바탕으로 결혼식에 초대할 사람의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이의 동기의 수 n (2 ≤ n ≤ 500)이 주어진다. 둘째 줄에는 리스트의 길이 m (1 ≤ m ≤ 10000)이 주어진다. 다음 줄부터 m개 줄에는 친구 관계 a(i) b(i)가 주어진다. (1 ≤ a(i) < b(i) ≤ n) a(i)와 b(i)가 친구라는 뜻이며, b(i)와 a(i)도 친구관계이다. 

출력

첫째 줄에 상근이의 결혼식에 초대하는 동기의 수를 출력한다.

예제 입력 1

6
5
1 2
1 3
3 4
2 3
4 5

예제 출력 1

3

힌트

2와 3은 상근이의 친구이다. 또, 3과 4는 친구이기 때문에, 4는 상근이의 친구의 친구이다. 5와 6은 친구도 아니고, 친구의 친구도 아니다. 따라서 2,3,4 3명의 친구를 결혼식에 초대한다.


더보기

Solution

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int main(void)
{
	int n, m, a, b, count=0;
	bool **list=NULL, *coming=NULL;

	scanf("%d", &n);
	list=(bool **)malloc(n*sizeof(bool *));
	for(int i=0;i<n;i++)
		list[i]=(bool *)calloc(n,sizeof(bool));
	coming=(bool *)calloc(n,sizeof(bool));

	scanf("%d", &m);

	for(int i=0;i<m;i++)
	{
		scanf("%d %d", &a, &b);
		a--;
		b--;

		list[a][b]=true;
		list[b][a]=true;
	}

	for(int i=1;i<n;i++)
		if(list[0][i])
		{
			coming[i]=true;
			for(int j=1;j<n;j++)
				if(list[i][j])
					coming[j]=true;
		}

	for(int i=1;i<n;i++)
		count+=coming[i];

	printf("%d\n", count);
	free(coming);
	for(int i=0;i<n;i++)
		free(list[i]);
	free(list);
	return 0;
}
728x90

+ Recent posts