Rylah's Study & Daily Life

[BOJ/C++] 2660. 회장 뽑기 본문

BOJ

[BOJ/C++] 2660. 회장 뽑기

Rylah 2022. 5. 3. 13:07

https://www.acmicpc.net/problem/2660

 

2660번: 회장뽑기

입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터

www.acmicpc.net

 

회장뽑기

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 6420 3444 2694 54.162%

문제

월드컵 축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이 모임은 만들어진지 얼마 되지 않았기 때문에 회원 사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 모두가 서로 알 수 있다. 각 회원은 다른 회원들과 가까운 정도에 따라 점수를 받게 된다.

예를 들어 어느 회원이 다른 모든 회원과 친구이면, 이 회원의 점수는 1점이다. 어느 회원의 점수가 2점이면, 다른 모든 회원이 친구이거나 친구의 친구임을 말한다. 또한 어느 회원의 점수가 3점이면, 다른 모든 회원이 친구이거나, 친구의 친구이거나, 친구의 친구의 친구임을 말한다.

4점, 5점 등은 같은 방법으로 정해진다. 각 회원의 점수를 정할 때 주의할 점은 어떤 두 회원이 친구사이이면서 동시에 친구의 친구사이이면, 이 두사람은 친구사이라고 본다.

회장은 회원들 중에서 점수가 가장 작은 사람이 된다. 회장의 점수와 회장이 될 수 있는 모든 사람을 찾는 프로그램을 작성하시오.

입력

입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터 회원의 수만큼 붙어 있다. 마지막 줄에는 -1이 두 개 들어있다.

출력

첫째 줄에는 회장 후보의 점수와 후보의 수를 출력하고, 두 번째 줄에는 회장 후보를 오름차순으로 모두 출력한다.

예제 입력 1 복사

5
1 2
2 3
3 4
4 5
2 4
5 3
-1 -1

예제 출력 1 복사

2 3
2 3 4

출처

Olympiad > 한국정보올림피아드 > KOI 1997 > 초등부 3번

  • 문제의 오타를 찾은 사람: ojh3316

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <bits/stdc++.h>
using namespace std;
 
vector<int> adj[55];
int dist[55];
int maxDist[55];
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int N;
    cin >> N;
 
    // Grpah Init
    while (true)
    {
        int u, v;
        cin >> u >> v;
        if (u == -1 && v == -1)
            break;
 
        adj[v].emplace_back(u);
        adj[u].emplace_back(v);
    }
 
    // BFS로 각 노드에서 최장거리를 maxDist에 저장
    for (int i{ 1 }; i <= N; i++)
    {
        // i번째에 각 distance 
        fill(dist, dist + N + 1-1);
        queue<int> q;
        q.push(i);
        dist[i] = 0;
 
        while (!q.empty())
        {
            int cur = q.front();
            q.pop();
 
            for (int nxt : adj[cur])
            {
                if (dist[nxt] >= 0)
                    continue;
 
                dist[nxt] = dist[cur] + 1;
                q.push(nxt);
            }
        }
 
        // i번째 회원 Score는 최장거리
        maxDist[i] = *max_element(dist, dist + N + 1);
    }
 
    int point = *min_element(maxDist + 1, maxDist + N + 1);
    int cnt = 0;
    
    for (int i{ 1 }; i <= N; i++)
    {
        if (maxDist[i] == point)
            cnt++;
    }
 
    cout << point << ' ' << cnt << "\n";
 
    for (int i{ 1 }; i <= N; i++)
    {
        if (maxDist[i] == point)
            cout << i << " ";
    }
    cout << "\n";
 
 
    return 0;
}
cs

C++ 11의 중괄호 초기화도 사용하는데 사실 변수보다는 pair, tuple 혹은 class 생성자 이니셜라이저 등에 더 적합한 것 같다.

 

그래프 문제이며 문제 읽는대로 입력하고 BFS를 돌고 그 값을 이용해서 최소 점수 회원이 회장 후보가 되는 그대로 구현되었다.

 

그래프 문제는 보통 1번부터 시작하는게 많아서 1-Index인 점을 유의해야 한다.

 

max_element, min_element 등에서 인덱스를 기억하는 것이 실수 줄이는 것

'BOJ' 카테고리의 다른 글

[BOJ/C++] 6996. 애너그램  (0) 2022.05.17
[BOJ/C++] 5597. 과제 안 내신 분..?  (0) 2022.05.17
[BOJ/C++] 10162. 전자레인지  (0) 2022.04.26
[BOJ/C++] 9625. BABBA  (0) 2022.04.12
[BOJ/C++] 17219. 비밀번호 찾기  (0) 2022.04.09