πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.2437 μ €μšΈ 문제 풀이

πŸ“– 문제

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

ν•˜λ‚˜μ˜ μ–‘νŒ” μ €μšΈμ„ μ΄μš©ν•˜μ—¬ 물건의 무게λ₯Ό μΈ‘μ •ν•˜λ €κ³  ν•œλ‹€. 이 μ €μšΈμ˜ μ–‘ νŒ”μ˜ λμ—λŠ” λ¬Όκ±΄μ΄λ‚˜ μΆ”λ₯Ό μ˜¬λ €λ†“λŠ” μ ‘μ‹œκ°€ 달렀 있고,

μ–‘νŒ”μ˜ κΈΈμ΄λŠ” κ°™λ‹€. λ˜ν•œ, μ €μšΈμ˜ ν•œμͺ½μ—λŠ” μ €μšΈμΆ”λ“€λ§Œ 놓을 수 있고, λ‹€λ₯Έ μͺ½μ—λŠ” 무게λ₯Ό μΈ‘μ •ν•˜λ €λŠ” 물건만 μ˜¬λ €λ†“μ„ 수 μžˆλ‹€.

λ¬΄κ²Œκ°€ μ–‘μ˜ μ •μˆ˜μΈ N개의 μ €μšΈμΆ”κ°€ μ£Όμ–΄μ§ˆ λ•Œ, 이 좔듀을 μ‚¬μš©ν•˜μ—¬ μΈ‘μ •ν•  수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ 무게 쀑 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄, λ¬΄κ²Œκ°€ 각각 3, 1, 6, 2, 7, 30, 1인 7개의 μ €μšΈμΆ”κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 μΆ”λ“€λ‘œ μΈ‘μ •ν•  수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ 무게 쀑 μ΅œμ†Ÿκ°’μ€ 21이닀.

πŸ” 접근법

Q.2437 μ €μšΈ 문제 ν’€μ΄μž…λ‹ˆλ‹€.

λ¬΄κ²Œκ°€ μ–‘μ˜ μ •μˆ˜μΈ N개의 μ €μšΈμΆ”κ°€ 주어지고 이 좔듀을 μ΄μš©ν•΄ μΈ‘μ •ν•  수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ 무게 쀑 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μ €μšΈμΆ”μ˜ λ¬΄κ²Œκ°€ 무쑰건 μ–‘μ˜ μ •μˆ˜λ‘œ 주어지기 λ•Œλ¬Έμ— 그리디 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ²˜μŒμ—λŠ” μ €μšΈμΆ”λ₯Ό 적은 λ¬΄κ²ŒλΆ€ν„° μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 이쀑 for문으둜 μΈ‘μ •ν•  무게λ₯Ό 1μ”© λ”ν•΄λ‚˜κ°€λ©° 츑정이 κ°€λŠ₯ν•œμ§€λ₯Ό ν™•μΈν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 λ°©λ²•μœΌλ‘œλ„ 풀이가 κ°€λŠ₯ν•˜μ§€λ§Œ ν•˜λ‚˜ν•˜λ‚˜ 일일이 λ‹€ ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— 더 λ§Žμ€ 수의 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ™”μŠ΅λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. λ§Œμ•½ μΆ”κ°€ 1 2 κ°€ μžˆλ‹€λ©΄ ν˜„μž¬ μΆ”λ“€μ˜ 무게λ₯Ό λ‹€ λ”ν•œ 3κΉŒμ§€ 즉 1 , 2 , 3 κΉŒμ§€ 츑정이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ 3의 μΆ”λ₯Ό μΆ”κ°€ν•œλ‹€λ©΄ (1,2,3) 1λΆ€ν„° ν˜„μž¬ μƒνƒœμ—μ„œ λͺ¨λ“  μΆ”λ₯Ό λ”ν•œ 값인 μ΅œλŒ€ 6 κΉŒμ§€

1+3 , 2+3, 3+3

즉 1, 2, 3, 4, 5 ,6 κΉŒμ§€ μΈ‘μ • κ°€λŠ₯ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ 8의 μΆ”κ°€ μΆ”κ°€λœλ‹€λ©΄ (1,2,3,8)

1, 2, 3, 4, 5, 6, 8, 9,10,11,12,13,14 7의 값은 츑정이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μΆ”λ“€μ˜ λˆ„μ ν•©+1 < λ‹€μŒ 무게의 μΆ” 이면 μΆ”λ“€μ˜ λˆ„μ ν•© +1을 μΈ‘μ •ν•  수 μ—†λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ μƒνƒœμ˜ μΆ”λ“€μ˜ λˆ„μ ν•©μ΄ 이미 ν˜„μž¬ μƒνƒœλ‘œ λ§Œλ“€ 수 μžˆλŠ” κ°’μ˜ μ΅œλŒ€κ°’μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

(ex 이미 1,2,3 으둜 이미 μ΅œλŒ€λ‘œ κ°€λŠ₯ν•œ 6κΉŒμ§€ 츑정이 κ°€λŠ₯ν•˜μ§€λ§Œ λ‹€μŒ μΆ”κ°€ 8이라면 8λΆ€ν„°λŠ” 츑정이 κ°€λŠ₯해도 7은 λ§Œλ“€μˆ˜κ°€ μ—†μŒ)

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ‹€μŒ 무게의 μΆ”κ°€ 적어도 ν˜„μž¬ μƒνƒœμ—μ„œ λ§Œλ“€ 수 μžˆλŠ” μ΅œλŒ€κ°’λ³΄λ‹€ μ΄ν•˜μ—¬μ•Ό ν˜„μž¬ μƒνƒœμ˜ μ΅œλŒ€κ°’+1 을 μΈ‘μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

package problem.greedy;

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

public class Main_2437 {
    static int weight[];
    static int n;
    static int max = 0;

    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        input();
        int result = solve();
        bw.write(Integer.toString(result));
        bw.flush();
        bw.close();
    }

    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        weight = new int[n];
        String inputs[] = br.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            weight[i] = Integer.parseInt(inputs[i]);
            max += weight[i];
        }
    }
    public static int solve() {
        int sum = 0;
        Arrays.sort(weight);
        for (int i = 0; i < n; i++) {
            if (sum + 1 < weight[i]) {
                return sum + 1;
            }
            sum += weight[i];
        }
        return max + 1;
    }
}

Written on January 21, 2021