Minimum Operations to Make Array Values Equal to K
EasyArrayHash Table
문제 설명
- 정수 배열
nums
와 정수k
가 주어집니다. num
에 다음과 같은 연산을 수행할 수 있습니다.- 유효한 정수
h
를 선택합니다.h
는 현재 배열에서h
보다 큰 값들이 모두 동일할 때 유효합니다.- 예:
[10, 8, 10, 8]
일 때,h=9
는 유효합니다. (9보다 큰 값은 모두 10)- 하지만
h = 5
는 유효하지 않습니다. (5보다 큰 값이 8과 10으로 서로 다름)
- 하지만
- 예:
- 모든
nums[i] > h
의 값을h
로 변경합니다.
- 유효한 정수
- 위 연산을 사용해 모든 요소를
k
로 만드는 최소 연산 횟수를 반환해야 합니다.- 만약, 불가능하면
-1
을 반환합니다.
- 만약, 불가능하면
문제 풀이
Set
💡 아이디어
- k보다 작은 값이 있다면 불가능 → -1
- k보다 큰 서로 다른 값의 개수 = 필요한 최소 연산 횟수
k
보다 작은 값이 있는 경우 → 불가능- 모든 요소를
k
로 만들기 위해서는 모든 값이k
이상이어야 합니다. - 하지만,
nums
에k
보다 작은 값이 하나라도 있다면, 해당 값은 아무리 연산을 해도k
이상이 될 수 없습니다. - 따라서, 이 경우 즉시
-1
을 반환합니다.
- 모든 요소를
k
보다 큰 값을k
로 낮추는 과정- 문제에서 주어진 연산은
h
보다 큰 값들을 모두h
로 낮추는 연산입니다. - 이때 유효한
h
는nums
내에서h
보다 큰 값들이 모두 동일한 경우에만 선택할 수 있습니다. - 이 조건을 사용하여 매 연산 마다 서로 다른 큰 수 중 하나만 제거할 수 있습니다.
- 예:
nums = [12, 12, 10, 10, 8, 8, 5], k = 5
인 경우, - 가능한 유효
h
는 11 → 9 → 7 → 5, 이런 식으로 하나씩 낮추면서 처리됩니다.
- 예:
- 따라서,
k
보다 큰 서로 다른 값의 개수만큼의 연산이 필요합니다. Set
을 사용해k
보다 큰 서로 다른 값들을 저장하고, 그 크기(set.size
)를 반환하면 필요한 연산의 최소 횟수가 됩니다.
- 문제에서 주어진 연산은
export function minOperations(nums: number[], k: number): number {
const set = new Set<number>();
for (const num of nums) {
if (num < k) {
return -1;
}
if (k < num) {
set.add(num);
}
}
return set.size;
}
복잡도
- 시간 복잡도:
- 공간 복잡도: