BOJ 5567, 결혼식

lilamaris
March 18, 2026 2 min read

문제

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

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

입력

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

출력

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

예제 입력 1

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

예제 출력 1

3

예제 입력 2

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

예제 출력 2

0

노트

  • 탐색 시작은 무조건 1번 정점부터 한다.
  • 문제 상 친구의 친구까지. 즉, 1번 정점에서 상대 거리가 2 이하인 정점의 개수를 카운팅하면 될 것 같다.

구현

#include <iostream>
#include <queue>
#include <vector>
#define IO std::cin.tie(NULL), std::ios_base::sync_with_stdio(false)

#define MAX 501
#define DEP_LIMIT 2

std::vector<int> V[MAX];
int dist[MAX];
int N, M;
int result = 0;

void BFS(int start) {
  std::queue<int> Q;
  dist[start] = 0;

  Q.push(start);

  while (!Q.empty()) {
    auto cur = Q.front();
    Q.pop();

    for (auto next : V[cur]) {
      if (dist[next] == -1) {
        dist[next] = dist[cur] + 1;
        if (dist[next] <= DEP_LIMIT) {
          Q.push(next);
          result++;
        }
      }
    }
  }
}

void solve() {
  std::cin >> N;
  std::cin >> M;

  std::fill(dist, dist + MAX, -1);

  int a, b;
  for (int i = 0; i < M; i++) {
    std::cin >> a >> b;
    V[a].push_back(b);
    V[b].push_back(a);
  }

  BFS(1);

  std::cout << result;
}

int main() {
  IO;
  solve();
  return 0;
}

개선점

  • 현재 BFS 코드는 문제 제약에 특화된 코드로 범용성이 떨어진다. 추후 확장성을 위해서는 BFS는 탐색만 하고, 집계는 따로 빼는게 나을 수도 있겠다.

© 2025 All Rights Reserved. Made with 🤍 by lilamaris