본문 바로가기
Problem Solving/Baekjoon

[백준] 2785 체인 - Greedy / Java

by graycode 2022. 12. 24.

 문제 링크

 

2785번: 체인

희원이는 그의 다락방에서 N개의 체인을 찾았다. 각각의 체인은 몇 개의 고리로 연결되어 있는데, 각각의 고리는 최대 두 개의 인접한 고리를 가질 수 있다. 각각의 고리는 열고 닫을 수 있다. 그

www.acmicpc.net

 

 풀이 과정

적은 개수의 고리를 가진 체인부터 먼저 사용해서 최소값을 구해야 하므로,

각각의 체인의 고리의 개수를 입력받아 배열에 저장 후 오름차순 정렬한다.

 

이 후 적은 개수의 고리를 가진 체인부터 각각 확인하여

현재까지 확인한 체인의 고리 중 일부분을 사용해 남은 체인을 연결할 수 있다면, (sum >= cnt)

남은 체인의 수 - 1은 열고 닫아야 할 최소한의 고리 수와 같으므로

반복문을 탈출해 해당 값 cnt 를 정답으로써 출력한다.

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

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

        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n];

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

        Arrays.sort(arr);

        int cnt = 0;
        int sum = 0;
        for (int i = 0; i < n; i++) {
            cnt = n - i - 1;
            sum += arr[i];

            if (sum >= cnt)
                break;
        }

        bw.write(String.valueOf(cnt));
        bw.flush();
    }

}

댓글