문제(출처: https://www.acmicpc.net/problem/16562)
< 친구비 >
문제 풀이 & 생각
bfs 탐색을 통해 친구의 친구 중에서 최소 비용을 구한다.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _16562_ { // 친구비
static int f[], money;
static ArrayList<HashSet<Integer>> arr;
static boolean visited[];
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
f = new int[n + 1];
arr = new ArrayList<>();
visited = new boolean[n + 1];
st = new StringTokenizer(bf.readLine());
for (int i = 1; i < n + 1; i++) {
f[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < n + 1; i++) {
arr.add(new HashSet<>());
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
arr.get(v).add(w);
arr.get(w).add(v);
}
int answer = 0;
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
visited[i] = true;
money = f[i];
bfs(i);
answer += money;
}
}
if (k < answer) {
System.out.println("Oh no");
} else {
System.out.println(answer);
}
}
private static void bfs(int idx) {
Queue<Integer> queue = new LinkedList<>();
queue.add(idx);
while (!queue.isEmpty()) {
int num = queue.poll();
for (int next : arr.get(num)) {
if (!visited[next]) {
visited[next] = true;
if (money > f[next]) {
money = f[next];
}
queue.add(next);
}
}
}
}
}
Main
- 학생 수 (n), 친구 관계 수 (m), 가지고 있는 돈(k) 입력
- f : 친구비
arr : 친구 관계 저장
visited: 방문 여부
- 학생 두 명(v, w) 입력 후 친구 관계(arr) 양방향으로 저장
- 친구 전체 탐색하며 아직 친구가 아니라면 친구 탐색 시작 (bfs 함수 호출)
- 모든 학생을 친구로 만들 수 있는 돈을 가지고 있다면 answer 출력, 돈이 부족하다면 "Oh no" 출력
bfs
- queue가 빌 때까지 반복 -> num의 인접 리스트 탐색하여 아직 방문하지 않은 곳이라면 방문 표시 / 현재 친구비 보다 친구의 친구비가 더 쌀 경우 친구비 교체 / queue에 추가
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 3425_고스택 (0) | 2023.06.27 |
---|---|
[Baekjoon] 14267_회사 문화 1 (0) | 2023.06.27 |
[Baekjoon] 1043_거짓말 (0) | 2023.06.26 |
[Baekjoon] 12893_적의 적 (0) | 2023.06.26 |
[Baekjoon] 7662_이중 우선순위 큐 (0) | 2023.06.19 |