알고리즘/백준

백준 5567 결혼식 JAVA

IamBD 2021. 12. 9. 10:35

solved.ac = 실버 2

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

 

5567번: 결혼식

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

www.acmicpc.net

 

1. 접근

 

상근이의 위치, 즉 1번 정점에서의 거리가 2 이하인 정점의 수만 카운트하면 끝이다!

즉, BFS의 시간복잡도인 O(V + E) = 500 + 10000 이면 풀 수 있다!

자신의 친구, 친구의 친구를 정점과 간선에 비유하면 1과 인접한 정점, 1과 인접한 정점과 인접한 정점(??)까지의 수 이며 2번, 3번, 4번 친구가 초대 대상이 된다.

 

2. 풀이

 

변수 세팅

static int N, M;
static int[] dist;
static ArrayList<Integer>[] graph;
public static void main(String[] args) throws IOException {
    N = Integer.parseInt(br.readLine()); // 상근이 친구 수 (상근이 포함)
    M = Integer.parseInt(br.readLine()); // 상근이 친구관계
    dist = new int[N + 1]; // 거리 카운트
    graph = new ArrayList[N + 1];
    for (int i = 1; i <= N; i++) {
        graph[i] = new ArrayList<>();
    }
    for (int i = 0; i < M; i++) {
        st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(st.nextToken()), y = Integer.parseInt(st.nextToken());
        graph[x].add(y); // 무방향 그래프는 양쪽으로 연결되어 있다.
        graph[y].add(x);
    }

    solution();
}

 

배열 초기화 및 정답 출력

static void solution() {
    Arrays.fill(dist, -1);
    System.out.println(BFS());
}

 

BFS

static int BFS() {
    int cnt = 0;
    Queue<Integer> Q = new LinkedList<>();
    Q.add(1); // 상근이의 위치는 항상 1이다.
    dist[1] = 0;

    while(!Q.isEmpty()) {
        int x = Q.poll();
        if (1 <= dist[x] && dist[x] <= 2) cnt++; // 상근이와의 관계가 친구 or 친구의 친구라면 카운트 한다.
        if (dist[x] == 2) continue; // 친구 관계의 거리가 2면 최대이니 그 이상은 볼 필요 없다.

        for (int y : graph[x]) {
            if (dist[y] != -1) continue; // 이미 방문한 점이라면 방문하지 않는다!
            Q.add(y);
            dist[y] = dist[x] + 1;
        }
    }
    return cnt;
}

 

3. 전체코드

'알고리즘 > 백준' 카테고리의 다른 글

백준 7569 토마토 JAVA  (0) 2021.12.10
백준 3055 탈출 JAVA  (0) 2021.12.09
백준 1389 케빈 베이컨의 6단계 법칙 JAVA  (0) 2021.12.08
백준 1697 숨바꼭질 JAVA  (0) 2021.12.08
백준 18404 현명한 나이트 JAVA  (0) 2021.12.07