https://www.codetree.ai/missions/2/problems/graph-traversal/description
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
정점과 간선이 주어지고, 1에서 출발해서 도착할 수 있는 정점을 구하는 문제이다.
처음에는 유니온파인드로 풀어야하나 했지만, 생각해보니 dfs로 탐색하고, 방문한 수로 같은 그래프에 해당하는 정점의 갯수를 구하는게 더 빨랐다.
리스트를 이용해서 각 정점과 연결되어있는 정점들을 저장했고, 1번리스트에 있는 정점들부터 stack에 차례로 쌓으면서 dfs를 수행했다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
List<Integer>[] list = new LinkedList[n+1];
for(int i = 1;i<=n;i++){
list[i] = new LinkedList<>();
}
for(int i = 0;i<m;i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
Stack<Integer> stack = new Stack<>();
for(int i = 0;i<list[1].size();i++){
stack.push(list[1].get(i));
}
boolean[] vis = new boolean[n+1];
vis[1] = true;
while(stack.isEmpty() != true){
int k = stack.pop();
if(vis[k] == false){
vis[k] = true;
for(int i = 0;i<list[k].size();i++){
int g = list[k].get(i);
if(vis[g] == false){
stack.push(g);
}
}
}
}
int cnt = 0;
for(int i = 2;i<=n;i++){
if(vis[i] == true) {
cnt++;
}
}
System.out.println(cnt);
}
}
'알고리즘 > 코드트리 문제풀이' 카테고리의 다른 글
코드트리 [자바 java] 빙빙 돌며 숫자 적기 (0) | 2023.07.29 |
---|---|
코드트리 [자바 java] 방향에 맞춰 이동 (0) | 2023.07.28 |
코드트리 [자바 java] k개 중에 1개를 n번 뽑기 (0) | 2023.07.26 |
코드트리 [자바 java] 숫자가 가장 큰 인접한 곳으로 동시에 이동 (0) | 2023.07.25 |
코드트리 [자바 java] 1차원젠가 (0) | 2023.07.25 |