PS/BaekJoon

[BaekJoon 5567번] 결혼식(C++)

박땅콩 2022. 8. 12.
728x90

※주의※
저의 풀이가 정답은 아닙니다.
다른 코드가 더 효율적이거나 좋을 수 있습니다.
언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

[문제 풀이 사이트]

 

 

5567번: 결혼식

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

www.acmicpc.net

 

[문제 설명]

 

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

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

 

[입력]

 

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

 

[출력]

 

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

 

[입출력 예]

 

입력 출력
6
5
1 2
1 3
3 4
2 3
4 5
3
6
5
2 3
3 4
4 5
5 6
2 5
0

 

[문제 풀이]

 

결혼식에 초대할 동기의 수를 출력하는 문제이다.
그래서 결혼식에 초대할 동기는 상근이(자신)의 친구와 친구의 친구를 초대할 수 있다.
➔ 이 내용으로 보아 상근이와 거리가 2인 친구까지 초대가 가능하다.

정점의 개수와 간선의 개수가 주어졌으므로 해당 내용을 바탕으로 인접 리스트를 구현한다.
그리고 상근이를 시작 정점으로 하여 BFS를 사용하고
큐에 다음 정점을 push할 때마다 dist[다음 정점] = dist[현재 정점] + 1을 함으로서 거리를 구했다.

마지막으로 BFS가 종료되었을 때 거리를 저장한 배열을 확인하여
거리가 0보다 크고 2보다 작거나 같은 경우에만 +1을 해줌으로서 +1을 한 총 합(동기의 수)을 출력했다.

[최종 코드]

 

[GitHub]

 

 

GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test

Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.

github.com

 

#include <bits/stdc++.h>
using namespace std;

vector<int> adj_matrix[501];
bool visited[501];
int dist[501];

void bfs(int cur) {
    queue<int> q;
    q.push(cur);
    visited[cur] = true;
    while(!q.empty()) {
        int curlocation = q.front();
        q.pop();
        for(auto element : adj_matrix[curlocation]) {
            if(visited[element] || dist[element] != 0) continue;
            q.push(element);
            dist[element] = dist[curlocation] + 1;
            visited[element] = true;
        }
    }
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n; // 상근이의 동기수
    cin >> n;
    int m; // 리스트의 길이
    cin >> m;
    for(int i = 0; i < m; ++i) {
        // 양방향 그래프
        int a, b;
        cin >> a >> b;
        adj_matrix[a].emplace_back(b);
        adj_matrix[b].emplace_back(a);
    }
    fill(dist, dist + 501, 0);
    fill(visited, visited + 501, false);
    // 자신의 친구와 친구의 친구
    
    bfs(1); // 상근이는 1
    int ans = 0;
    for(int i = 1; i <= n; ++i) {
        if(dist[i] > 0 && dist[i] <= 2) {
            ans += 1;
        }
    }
    cout << ans;
    return 0;
}

 

728x90

댓글