본문 바로가기
백준

[백준 17089] 세 친구, C++

by 황인태(intaehwang) 2020. 2. 4.
반응형

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

 

17089번: 세 친구

첫째 줄에 사람의 수 N(3 ≤ N ≤ 4,000), 친구 관계의 수 M(0 ≤ M ≤ 4,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계를 의미하는 두 정수 A, B가 주어진다. 친구 관계는 A와 B, 그리고 B와 A가 친구라는 것을 의미한다. 사람은 1번부터 N번까지 번호가 매겨져 있다. 같은 친구 관계가 두 번 이상 주어지는 경우는 없다.

www.acmicpc.net

 본 문제는 n명의 사람 중 a, b, c 세 명을 선택한다. a, b, c 세 명 다 친구 일 경우 각각 친구의 수의 합을 구한다. 단, a의 친구 수를 계산할 때, b와 c는 빼고 계산해야 하고, b의 친구 수를 계산할 때는 a와 c, c의 친구 수를 계산할 때는 a, b를 빼고 계산해야 한다.

예를 들어 n = 5일 때, 친구인 경우는 (1 2 3), (1 2 4), (1 2 5), (1 3 4), ... (2 4 5), (3 4 5) 가 있다. 5명의 사람 중 중복없이, 오름차순으로 정렬한 형태로 나온다.

  1. a를 선택한다.
  2. a보다 큰 b를 선택한다.
  3. a와 b의 관계를 확인한다.
  4. b보다 큰 c를 선택한다.
  5. (a, c), (b, c)의 관계를 확인한다.
  6. 친구의 수를 더하고 조건에 맞게 6을 뺀다.
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
#include <cstdio>
#include <vector>
 
using namespace std;
 
bool chk[4001][4001];
int frien[4001];
 
int main() {
    int n, m;
    int ans = -1;
    scanf("%d %d"&n, &m);
    for (int i = 0; i < m; i++) {
        int x, y;
        scanf("%d %d"&x, &y);
        frien[x] += 1;
        frien[y] += 1;
        chk[x][y] = true;
        chk[y][x] = true;
    }
    for (int a = 1; a <= n; a++) {
        for (int b = a+1; b <= n; b++) {
            if (chk[a][b]) {
                for (int c = b+1; c <= n; c++) {
                    if (chk[a][c] && chk[b][c]) {
                        int sum = frien[a] + frien[b] + frien[c] - 6;
                        if (ans == -1 || ans > sum) ans = sum;
                    }
                }
            }
        }
    }
    printf("%d\n", ans);
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 11728] 배열 합치기, C++  (0) 2020.02.05
[백준 10816] 숫자 카드 2, C++  (0) 2020.02.05
[백준 17088] 등차수열 변환, C++  (0) 2020.02.02
[백준 16932] 모양 만들기, C++  (0) 2020.01.31
[백준 16236] 아기 상어, C++  (0) 2020.01.31
Buy me a coffeeBuy me a coffee

댓글