HwangHub
[BFS&DFS/Java] SWEA 7465. 창용 마을 무리의 개수 본문
해석
이 문제는 인접 리스트를 이용하여 relation group의 개수를 묻는 문제이다. 따라서 그래프 탐색을 통해 연관 노드를 한번에 방문하는 방식으로 로직을 전개하면 마을의 개수를 구할 수 있다.
보통 격자 상에서의 그래프 알고리즘이 아닌, 이 문제와 같이 인접 행렬 또는 인접 리스트를 활용하는 그래프 알고리즘의 시간복잡도는 인접 행렬과 리스트 각각 O(v^2), O(v + e)이다. 이는 아래 구현된 로직에서도 확인할 수 있다.
노드의 개수가 최대 100개라고 주어져 있으므로, 인접 행렬이든 리스트든 관련 없이 문제를 풀 순 있었을 것이다. 간선의 개수는 n(n-1)/2개라고 되어있으므로 인접 행렬로 구현하였다.
풀이
DFS
package ssafy.사전학습.그래프;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 창용_마을_무리의_개수 {
private static boolean[] visited;
private static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
for (int i = 1; i <= t; i++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
visited = new boolean[n];
graph = new int[n][n];
// 인접 리스트 초기화
for (int j = 0; j < m; j++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
graph[a][b] = b;
graph[b][a] = a;
}
int ans = 0;
for (int j = 0; j < n; j++) {
if (!visited[j]) {
ans += dfs(j); // edit-point
}
}
System.out.println("#" + i + " " + ans);
}
}
private static int dfs(int start) {
for (int v : graph[start]) {
if (v > 0 && !visited[v]) {
visited[v] = true;
dfs(v);
}
}
return 1;
}
}
BFS
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class 창용_마을_무리의_개수 {
private static boolean[] visited;
private static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
for (int i = 1; i <= t; i++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
visited = new boolean[n];
graph = new int[n][n];
// 인접 리스트 초기화
for (int j = 0; j < m; j++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
graph[a][b] = b;
graph[b][a] = a;
}
int ans = 0;
for (int j = 0; j < n; j++) {
if (!visited[j]) {
ans += bfs(j); // edit-point
}
}
System.out.println("#" + i + " " + ans);
}
}
private static int bfs(int start) {
Queue<Integer> q = new LinkedList<>();
q.add(start);
visited[start] = true;
while (!q.isEmpty()) {
Integer now = q.poll();
for (int v : graph[now]) {
if (!visited[v]) {
q.add(v);
visited[v] = true;
}
}
}
return 1;
}
}
'workspace > algorithm' 카테고리의 다른 글
[유니온파인드/Java] SWEA 1248 공통조상 (1) | 2024.01.09 |
---|---|
[다익스트라/자바] SWEA 4193. 수영대회 결승전 (1) | 2024.01.06 |
[다익스트라/Java] SWEA 1249. 보급로 (2) | 2024.01.05 |
[자바/완탐] 코드트리 IL. 최단 run length 인코딩 (0) | 2023.11.26 |
[DP/자바] 코드트리 IL. 2차원 최대 증가 수열 (0) | 2023.11.20 |
Comments