백준 5567번
https://www.acmicpc.net/problem/5567
for (int friendNum : nodeList.get(num)) {
if(dist[friendNum] == 0) {
dist[friendNum] = dist[num] + 1;
que.offer(friendNum);
}
}
방문한적이 없는 노드, 즉 dist
의 값이 0일 경우, 기존의 dist
의 값에서 + 1을 하여 새로 갱신해준다.
이렇게 하면 1번 노트에서 출발해서 갈 수 있는 노드를 모두 알 수 있다.
for(int i=2; i<=N; i++) {
if(arr[1][i] == 0) continue;
dist[i] = 1;
for(int j=2; j<=N; j++) {
if(arr[i][j] == 1) {
dist[i] = dist[j] = 1;
}
}
}
인접행렬에서는 1행을 기준으로 갈 수 있는 곳을 찾는다. 1의 값을 가지고 있을 때는 연결된 노드를 의미한다.
또한 1을 가지고 있는 노드가 다른 노드를 가지고 있는지 체크한다. 체크하는 과정에서 또 1이 나올 경우, ㅏ친구의 친구이므로 정답으로 포함된다.
인접리스트
import java.util.*;
import java.io.*;
public class Main {
static List<List<Integer>> nodeList;
static int dist[];
static boolean visit[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
nodeList = new ArrayList<>();
for (int i = 0; i <= N; i++) {
nodeList.add(new ArrayList<>());
}
dist = new int[N + 1];
visit = new boolean[N + 1];
while (M-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int parent = Integer.parseInt(st.nextToken());
int son = Integer.parseInt(st.nextToken());
nodeList.get(parent).add(son);
nodeList.get(son).add(parent);
}
graphSearch(1);
int resultCount = 0;
for (int i = 2; i <= N; i++) {
if (dist[i] <= 3 && dist[i] > 0) {
resultCount++;
}
}
System.out.print(resultCount);
} // End of main
private static void graphSearch(int startNum) {
Queue<Integer> que = new LinkedList<>();
que.offer(startNum);
dist[startNum] = 1;
while (!que.isEmpty()) {
int num = que.poll();
for (int friendNum : nodeList.get(num)) {
if(dist[friendNum] == 0) {
dist[friendNum] = dist[num] + 1;
que.offer(friendNum);
}
}
}
} // End of graphSearch
} // End of Main class
인접행렬
import java.util.*;
import java.io.*;
public class Main {
static int arr[][];
static int dist[];
static int N, M;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
arr = new int[N+1][N+1];
dist = new int[N+1];
while(M-->0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int parent = Integer.parseInt(st.nextToken());
int son = Integer.parseInt(st.nextToken());
arr[parent][son] = arr[son][parent] = 1;
}
for(int i=2; i<=N; i++) {
if(arr[1][i] == 0) continue;
dist[i] = 1;
for(int j=2; j<=N; j++) {
if(arr[i][j] == 1) {
dist[i] = dist[j] = 1;
}
}
}
int resultCount = 0;
for(int i=1; i<=N; i++) {
resultCount += dist[i];
}
System.out.println(resultCount);
} // End of main
} // End of Main class