
-Code
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
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());
// 섬마다 있는 사람 수
st = new StringTokenizer(br.readLine());
int[] people = new int[n + 1];
for (int i = 1; i <= n; i++) {
int cnt = Integer.parseInt(st.nextToken());
people[i] = cnt;
}
// 왕복 다리를 담는 리스트 생성
List<ArrayList<Integer>> bridge = new ArrayList<>();
for (int i = 0; i <= n; i++) {
bridge.add(new ArrayList<>());
}
// 왕복 다리 셋팅
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
// 왕복 다리이므로 양방향으로 셋팅해 줍니다!
bridge.get(start).add(end);
bridge.get(end).add(start);
}
// 이동 가능한지 dfs로 검사
boolean[] visited = new boolean[n + 1];
isJoin(visited, bridge, 1);
int answer = 0;
for (int i = 1; i <= n; i++) {
if (visited[i]) answer += people[i];
}
System.out.println(answer);
}
// dfs로 탐색
private static void isJoin(
boolean[] visited,
List<ArrayList<Integer>> bridge,
int now
) {
visited[now] = true;
for (int next : bridge.get(now)) {
if (!visited[next]) {
isJoin(visited, bridge, next);
}
}
}
}
처음에 DFS/BFS로 접근은 잘했으나 각 섬마다 검색을 하고 양방향 세팅을 해야 하는데 단반향 세팅으로 해서 틀렸었습니다. 이 2개의 문제를 알게 된 후 1번 섬만 검색하고, 양방향 세팅으로 수정하여 해결했습니다.
'알고리즘 문제 > Java' 카테고리의 다른 글
| [goormlevel/Java] Goorm Party 2 (0) | 2026.05.20 |
|---|---|
| [goormlevel/Java] 가장 높은 점수 구하기 (0) | 2026.05.19 |
| [goormlevel/Java] 모임 장소 1 (0) | 2026.05.17 |
| [goormlevel/Java] 재참석자 수 세기 (0) | 2026.05.16 |
| [프로그래머스/Java] 혼자 놀기의 달인 (0) | 2026.05.15 |