팡세영
Log sey
팡세영
전체 방문자
오늘
어제
  • 분류 전체보기 (73)
    • PS (45)
      • programmers (13)
      • 백준 (29)
    • Android (16)
    • Daily (0)
    • Kotlin (6)
    • Design Pattern (1)
    • Java (1)
    • Flutter (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 정렬
  • Kotlin
  • 골드
  • 완전탐색
  • CustomView
  • 해쉬맵
  • flutter
  • 의존성 주입
  • 프로그래머스
  • 자바
  • 실버
  • LEVEL2
  • binding
  • mvvm
  • Android
  • DFS
  • 이분탐색
  • programmers
  • 구현
  • 문자열
  • ArcitecturePattern
  • 하단네비게이션바
  • 안드로이드
  • programmers #프로그래머스
  • java
  • 코틀린
  • BFS
  • TestCode
  • 백준
  • compose

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
팡세영

Log sey

백준 - 친구비 16562
PS/백준

백준 - 친구비 16562

2023. 3. 8. 09:04


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

 

16562번: 친구비

첫 줄에 학생 수 N (1 ≤ N ≤ 10,000)과 친구관계 수 M (0 ≤ M ≤ 10,000), 가지고 있는 돈 k (1 ≤ k ≤ 10,000,000)가 주어진다. 두번째 줄에 N개의 각각의 학생이 원하는 친구비 Ai가 주어진다. (1 ≤ Ai ≤ 10,

www.acmicpc.net


[문제 접근]

  • union-find 알고리즘 사용
  • union 함수에서 부모 설정할 때 cost가 더 낮은 친구로 설정
  • 1 ~ N 까지 find 함수로 부모를 찾아 준 후 cost를 더해 주고, 방문 처리를 통해 이미 더해준 집합은 건너뜀

[Java]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main
{
    static int parent[];
    static int cost[];
    static boolean visited[];
    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());

        parent = new int[n+1];
        cost = new int[n+1];

        for(int i=1; i<=n; i++) parent[i] = i;

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

        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            union(a,b);
        }

        int sum = 0;
        visited = new boolean[n+1];
        for(int i=1; i<=n; i++){
            int p = find(i);

            if(visited[p])
                continue;

            sum += cost[p];
            visited[p] = true;
        }

        if(k >= sum){
            System.out.println(sum);
        }else
            System.out.println("Oh no");


    }

    public static void union(int a, int b){
        int x = find(a);
        int y = find(b);

        if(x == y) return;

        if(cost[x] >= cost[y])
            parent[x] = y;
        else
            parent[y] = x;
    }

    public static int find(int a){
        if(parent[a] == a) return a;

        return parent[a] = find(parent[a]);
    }



}



'PS > 백준' 카테고리의 다른 글

백준 - Packet Routing 6951 java  (0) 2023.03.09
백준 - 연속합 1912 java  (0) 2023.03.06
백준 - 문자열 집합 조합하기 25328  (0) 2023.03.03
백준 - 캠프 준비 16938  (0) 2023.03.01
[백준] - 도영이가 만든 맛있는 음식 2691  (0) 2023.02.28
    'PS/백준' 카테고리의 다른 글
    • 백준 - Packet Routing 6951 java
    • 백준 - 연속합 1912 java
    • 백준 - 문자열 집합 조합하기 25328
    • 백준 - 캠프 준비 16938
    팡세영
    팡세영
    Android, CS, PS

    티스토리툴바