본문 바로가기
코딩테스트 준비/백준

[백준] 16200번 - 해커톤 [Java]

by mwzz6 2025. 1. 22.

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

 

[백준] 16200번 - 해커톤 [Java]
[백준] 16200번 - 해커톤 [Java]
[백준] 16200번 - 해커톤 [Java]


1.  아이디어

 

카운팅 배열을 활용해서 X명 이하로 팀을 구성해야 하는 사람들의 수를 인덱스에 맞춰서 넣어줬다. 이후 몫 연산으로 해당 그룹의 개수를 알아내고 나머지 인원은 더 많은 사람이 팀에 구성되도 되는 사람과 팀을 이루어줬다.


2. 문제풀이

 

X명 이하로 팀을 이뤄야하는 사람 수가 N일 때 해당 인원수로 N/X의 팀을 구성할 수 있고 남은 인원이 있으면 X+1명 이하로 팀을 이뤄야하는 사람과 합쳐서 한 팀을 만드는 방식으로 구현했다. 이때 X+1명 이하로 팀을 이뤄야하는 사람 수가 이것 때문에 음수 처리가 될 수 있어서 음수인 사람 수는 다음 그룹에 넘기는 방식으로 구현했다.


3. 코드

 

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

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

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

        int[] cntArr = new int[1 + N + 1];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            int X = Integer.parseInt(st.nextToken());
            cntArr[X]++;
        }

        int ans = 0;
        for (int i = 1; i <= N; i++) {
            if (cntArr[i] < 0) {
                cntArr[i + 1] += cntArr[i];
                cntArr[i] = 0;
                continue;
            }

            int q = cntArr[i] / i;
            int r = cntArr[i] % i;

            ans += q;
            if (r != 0) {
                cntArr[i + 1] -= i - r;
                ans++;
            }
        }

        System.out.println(ans);
    }
}

4. 후기