Closed Jewan1120 closed 1 week ago
=> O(N * N)은 불가(X), O(N) or O(NlogN)으로 생각해보기
(i+1)번쨰와 i번째의 차이
가 됨(K-1)
개의 차이를 없애야 함1 ≤ K, N ≤ 300,000 -> O(N)
dff(키 차이 배열) 생성
dffi[i] = 인접한 원생들 간의 키 차이 저장
-> 오름차순 정렬
(K-1)개 구분선
for(int i=0; i<(N-1)-(K-1); i++){
result += diff[i];
}
(N-1) - (K-1) = N-K개
처음에 K명씩 어떻게 할당해주지 싶었는데 diff(차이 배열)을 구해서 푸는 방법이 있더라고요..!
Nlog(K) ≈ 5,458,380
인걸 고려해서 풀이해야 함300,000 * 299,999 * ... * 2 * 1
이렇게 되서 그런 것 같음int[] diff = new int[N];
int result
: 사용되는 비용
diff
에서 차이가 큰 부분을 기준으로 조를 나누어서 비용이 들지 않도록 함 (Arrays.sort(diff)
)for(int i = 0; i < N - K; i++) result += diff[i];
O(N)
이내dif배열
: 옆사람과 차이 배열처음에 투포인터로 복잡하게 풀었는데,, 정렬 개념 잘 사용하기
N-K
개만 선택하면 됨1 ≤ N ≤ 300,000
그리디 순회 O(N)
+ 정렬 O(logN)
> O(NlogN)
이내로 풀이모든 원생들의 대소 차이
를 구하고 최소 비용을 구하기 위해 오름차순 정렬
하기1. 초기 상태:
children 배열이 [1 3 5 6 10] 이고, 각 원소 간의 차이 값을 계산한 costs 배열은 [2 2 4 1]
2. costs 배열 정렬:
오름차순으로 정렬하면 [1 2 2 4]
3. K개의 그룹으로 나누기⭐:
예를 들어, K=3 이라고 가정하면, 3개의 그룹으로 나누기 위해서는 K-1개를 기준으로 그룹을 나눌 수 있습니다.
문제의 요구사항인 최소 비용을 구하기 위해 2개(K-1)의 가장 큰 차이 값(4와 2)을 기준으로 그룹을 나누면
[1 3], [5 6], [10] 와 같이 3개의 그룹으로 나뉘게 됩니다.
4. 작은 차이 값들 합산하기⭐:
K-1 개는 그룹을 나누는 기준이기 때문에 이를 제외하면 "(N-1)-(K-1) = N-K" 이 되고,
남은 차이 값들인 [1 2] 를 합산하면 K개의 조로 나누었을 때, 티셔츠를 만드는 최소 비용이 됩니다.