알고리즘/백준 문제풀이

백준 [자바 java] 16562번 : 친구비

잔디🌿 2025. 3. 4. 21:27

문제설명

준석이는 친구를 사귀기 위해서는 친구비를 내야한다.

이 때 친구비를 내서 사귄 친구의 친구는 그냥 사귈 수 있다. 

모든 친구를 사귀기 위한 친구비의 최소비용은?

 

풀이

dfs로 풀었다. 한 무리를 탐색할 때마다 그 무리 중 친구비가 가장 적은 비용을 구한다.

그 친구비의 합이 준석이가 가지고 있는 비용보다 작으면 Oh no를 출력한다.

package org.example;
import java.util.*;
import java.io.*;

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());
    int k = Integer.parseInt(st.nextToken());

    int[] mon = new int[n+1];
    int[] vis = new int[n+1];

    st = new StringTokenizer(br.readLine());
    for(int i = 1;i<=n;i++){
      mon[i] = Integer.parseInt(st.nextToken());
    }

    ArrayList<ArrayList<Integer>> list = new ArrayList<>();

    for(int i = 0;i<=n;i++){
      list.add(new ArrayList<>());
    }

    for(int i = 1;i<=m;i++){
      st = new StringTokenizer(br.readLine());
      int a = Integer.parseInt(st.nextToken());
      int b = Integer.parseInt(st.nextToken());
      list.get(a).add(b);
      list.get(b).add(a);
    }
    int ans = 0;

    for(int i = 1;i<=n;i++){
      Stack<Integer> stack = new Stack<>();
      int nowMon = 10000000;
      if(vis[i] == 0){
        vis[i] = 1;
        stack.push(i);
        while(!stack.isEmpty()){
          int now = stack.pop();
          vis[now] = 1;
          if(nowMon > mon[now]){
            nowMon = mon[now];
          }
          for(int j = 0;j<list.get(now).size();j++){
            if(vis[list.get(now).get(j)] == 0){
              stack.push(list.get(now).get(j));
            }
          }
        }
        ans += nowMon;
      }
    }

    if(k < ans){
      System.out.println("Oh no");
    }
    else{
      System.out.println(ans);
    }
  }
}

 

한번에 성공!

 

https://www.acmicpc.net/problem/16562