본문 바로가기
Algorithm

백준 5567번 <결혼식>

by seungh2 2022. 12. 15.

백준 알고리즘 5567번

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

 

5567번: 결혼식

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

www.acmicpc.net


5567번

상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 자신의 친구의 친구를 초대하기로 했다.

상근이가 동기들의 친구 관계를 모두 조사한 리스트가 있을 때, 결혼식에 초대할 사람의 수를 구하여라.

 

입력으로 첫 줄에 상근이의 동기 수 N이 주어지고 둘째 줄에 리스트의 길이 M이 주어진다.

그다음 M개의 줄에 친구 관계가 주어진다. (이때, a b로 주어지며 이는 a와 b가 친구라는 뜻이다.)

 


문제 해결

BFS를 이용해 풀 수 있다.

보통의 BFS는 큐가 빌 때까지 진행하지만, 이 문제에서는 상근이의 친구와, 상근이의 친구의 친구만 구하면 되기 때문에 2번만 진행하면 된다.

처음에 큐에 상근이의 학번인 1을 넣는다. 이 상태에서 BFS를 2번 돌린다.

1번째 돌릴 때는 큐의 크기인 1만큼 값을 꺼내서 상근이의 친구를 다시 큐에 넣는다.

→ 상근이의 친구 수를 알 수 있다.

2번째 돌릴 때는 큐의 크기(상근이의 친구 수)만큼 값을 꺼내서 상근이의 친구의 친구를 다시 큐에 넣는다.

→ 상근이의 친구의 친구 수를 알 수 있다.

 


코드

package boj5567;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;

/*
 * BFS를 2번 돌렸다.
 * 처음 시작을 1(상근이)로
 * BFS : 현재 Q의 크기만큼 값을 꺼내서 그 친구의 인접 친구 중 count되지 않은 친구를 다시 Q에 넣는다.
 * count 값에 Q의 크기를 더한다.
 * */

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine()); // N : 상근이의 동기 수. 1은 상근이
		int M = Integer.parseInt(br.readLine()); // M : 동기들의 친구 관계의 수.
		ArrayList<ArrayList<Integer>> adjList = new ArrayList<>(); // adjList.get(i) : i와 친구인 사람의 list
		for (int i = 0; i < N + 1; i++) {
			adjList.add(new ArrayList<Integer>());
		}
		for (int i = 0; i < M; i++) {
			String[] inArr = br.readLine().split(" ");
			// a랑 b랑 친구
			int a = Integer.parseInt(inArr[0]);
			int b = Integer.parseInt(inArr[1]);
			adjList.get(a).add(b);
			adjList.get(b).add(a);
		}

		int count = 0; // count : 상근이의 결혼식에 초대할 동기의 수
		boolean[] visit = new boolean[N + 1]; // visit[i] : i번 동기가 count 되었는지 표시
		Queue<Integer> Q = new ArrayDeque<>(); // Q : BFS를 돌릴 때 사용할 Q

		Q.add(1);
		visit[1] = true;

		// p = 0 -> 상근이의 친구가 Q에 들어간다.
		// p = 1 -> 상근이의 친구의 친구가 Q에 들어간다.
		for (int p = 0; p < 2; p++) {
			int size = Q.size();
			for (int q = 0; q < size; q++) {
				int n = Q.poll();
				for (int i = 0; i < adjList.get(n).size(); i++) {
					int getN = adjList.get(n).get(i);
					if (visit[getN])
						continue;
					Q.add(getN);
					visit[getN] = true;
				}
			}
			count += Q.size();
		}

		System.out.println(count);
	}

}

 

시도해본 테스트케이스

/*
4
3
1 2
1 3
4 3

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

0
---------------
4
1
1 4

1
---------------
*/

결과

 


 

728x90

'Algorithm' 카테고리의 다른 글

백준 1303번 <전쟁-전투>  (0) 2022.12.27
[프로그래머스] 프린터  (0) 2022.12.16
비슷한 단어  (0) 2022.10.23
백준 1600번 <말이 되고픈 원숭이>  (0) 2022.10.03
백준 1189번 <컴백홈>  (0) 2022.10.02

댓글