문제
상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 친구의 친구를 초대하기로 했다. 상근이의 동기는 모두 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
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 10798번: 세로읽기 (0) | 2021.02.04 |
---|---|
<백준 알고리즘> 2740번: 행렬 곱셈 (0) | 2021.02.04 |
<백준 알고리즘> 14920번: 3n+1 수열 (0) | 2021.01.31 |
<백준 알고리즘> 15720번: 카우버거 (0) | 2021.01.31 |
<백준 알고리즘> 2116번: 주사위 쌓기 (0) | 2021.01.31 |