[Java] BOJ16562, 백준 - 친구비

2022. 2. 25. 18:16·알고리즘/문제풀이
728x90

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가 주어진다. (

www.acmicpc.net

 

이것 또한 유니온파인드 응용문제이나, 기초가 탄탄하다면 쉽게 풀 수 있는 문제이다.
int[] parent 배열로 그룹번호를 관리해주고
int[] min 배열로 해당 그룹의 최소 친구비를 관리해주면 된다.

import java.io.*;
import java.util.*;

public class Main {

	private static int[] parent;
	private static int[] min; // 해당 그룹의 최소 친구비

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = parse(st.nextToken()); // 학생 수
		int m = parse(st.nextToken()); // 친구관계 수
		int k = parse(st.nextToken()); // 가진 돈
		min = new int[n + 1];
		st = new StringTokenizer(br.readLine());
		for (int i = 1; i <= n; i++)
			min[i] = parse(st.nextToken());

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

			union(a, b);
		}

		// 친구비 계산
		int fee = 0;
		boolean[] check = new boolean[n + 1];
		for (int i = 1; i <= n; i++) {
			int p = find(parent[i]);
			if (check[p])
				continue;
			// 방문한 적 없는 그룹만..
			check[p] = true;
			fee += min[p];
		}
		System.out.println(((k >= fee) ? fee : "Oh no"));
	}

	private static void makeSet(int n) {
		parent = new int[n + 1];
		for (int i = 1; i <= n; i++)
			parent[i] = i;
	}

	private static int find(int a) {
		if (a == parent[a])
			return a;
		else
			return parent[a] = find(parent[a]);
	}

	private static void union(int a, int b) {
		int ra = find(a);
		int rb = find(b);
		if (ra != rb) {
			// 해당 그룹의 최소 친구비를 갱신
			min[ra] = Math.min(min[ra], min[rb]);
			parent[rb] = ra;
		}
	}

	private static int parse(String s) {
		return Integer.parseInt(s);
	}
}

 

저작자표시 (새창열림)

'알고리즘 > 문제풀이' 카테고리의 다른 글

[Java] 프로그래머스 - 전력망을 둘로 나누기  (0) 2022.04.05
[Java] BOJ20364, 백준 - 부동산 다툼  (0) 2022.03.09
[Java] BOJ1043, 백준 - 거짓말  (0) 2022.02.25
[Java] BOJ16236, 백준 - 아기 상어  (0) 2022.02.25
[Java] BOJ16954, 백준 - 움직이는 미로 탈출  (0) 2022.02.25
'알고리즘/문제풀이' 카테고리의 다른 글
  • [Java] 프로그래머스 - 전력망을 둘로 나누기
  • [Java] BOJ20364, 백준 - 부동산 다툼
  • [Java] BOJ1043, 백준 - 거짓말
  • [Java] BOJ16236, 백준 - 아기 상어
kkap999
kkap999
IT에 관심 가득한 갑갑이의 개발&스터디 블로그
  • kkap999
    갑갑이의 개발세상
    kkap999
    • 분류 전체보기 (95)
      • Backend (1)
        • Java&Spring&Servlet (8)
        • DB (0)
      • 알고리즘 (78)
        • 문제풀이 (70)
        • 자료구조 (6)
        • 그 외 (2)
      • App&FE (3)
        • FE (1)
        • Flutter (2)
      • Computer Science (0)
        • 네트워크 (0)
        • 컴퓨터기초 (0)
      • Cloud (0)
        • AWS (0)
        • Azure (0)
        • gcp (0)
      • 잡담&일상 (4)
        • 일상 (1)
        • 잡담 (2)
        • 음악 (1)
  • 태그

    N과M(1)
    BOJ
    백준
    알고리즘
    BOJ15649
  • 링크

    • github
  • 인기 글

  • 최근 글

  • 05-17 01:38
  • 전체
    오늘
    어제
  • 반응형
  • hELLO· Designed By정상우.v4.10.3
kkap999
[Java] BOJ16562, 백준 - 친구비
상단으로

티스토리툴바