https://www.acmicpc.net/problem/5567
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도 친구관계이다.
출력
첫째 줄에 상근이의 결혼식에 초대하는 동기의 수를 출력한다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static boolean[] visited;
static ArrayList<ArrayList<Integer>> g = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
visited = new boolean[n + 1];
for (int i = 0; i < n + 1; i++) {
g.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
g.get(a).add(b);
g.get(b).add(a);
}
dfs(1, 0);
System.out.println(result);
}
static int result = -1;
static void dfs(int x, int depth) {
if(depth >= 3) return;
if(!visited[x]) {
result += 1;
visited[x] = true;
}
for (int i = 0; i < g.get(x).size(); i++) {
Integer v = g.get(x).get(i);
dfs(v, depth + 1);
}
}
}
해결방법
결혼식에 상근이의 친구 혹은 상근이의 친구의 친구를 초대할 수 있다. 이때 초대 가능한 사람의 수를 출력하는 문제이다.
상근이는 친구관계의 값 1에 해당한다.
예제1의 경우 (1,2), (1,3), (3,4) => 2, 3, 4 => 총 3명을 초대할 수 있다.
6
5
1 2
1 3
3 4
2 3
4 5
DFS를 사용하면 쉽게 풀 수 있다. 인자로 depth(깊이)를 두어 상근이 친구의 친구까지만 DFS() 호출이 이뤄지도록 구현하면 된다.
주의할 점은 한 번 방문한 정점을 다시 방문가능하게 해야한다.
이유는 (1, 2) -> (2, 3) -> (1, 3) -> (3, 4) 순으로 진행이 될텐데, (2, 3) 시점에서 2, 3의 visted는 true일 것이다. 그러면 그 이후인 (1, 3)는 3을 방문했기에 실행되지 않아 초대할 수 있는 사람이 총 2명이 나온다.
고로 방문한 정점을 다시 방문해야 한다.
'알고리즘 > 백준' 카테고리의 다른 글
1931번 : 회의실 배정 (0) | 2023.08.23 |
---|---|
20365번 : 블로그2 (0) | 2023.08.22 |
1374번 : 강의실 (0) | 2023.08.04 |
10775번 : 공항 (0) | 2023.08.03 |
13904번 : 과제 (0) | 2023.08.03 |