-
[LeetCode] 330. Patching Array알고리즘 문제 풀이 2021. 8. 30. 12:04
문제 출처: https://leetcode.com/problems/patching-array/
Patching Array - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제
정렬된 정수 배열 nums 와 정수 n 이 주어지면, 배열의 일부 원소의 합이 [1, n] 범위를 모두 포함할 수 있도록 배열에 원소를 추가하라.
추가해야 하는 원소의 최소 숫자를 반환하라.
예제
Input: nums = [1,3], n = 6 Output: 1 Explanation: Combinations of nums are [1], [3], [1,3], which form possible sums of: 1, 3, 4. Now if we add/patch 2 to nums, the combinations are: [1], [2], [3], [1,3], [2,3], [1,2,3]. Possible sums are 1, 2, 3, 4, 5, 6, which now covers the range [1, 6]. So we only need 1 patch.
Input: nums = [1,5,10], n = 20 Output: 2 Explanation: The two patches can be [2, 4].
Input: nums = [1,2,2], n = 5 Output: 0
풀이
문제의 해결의 핵심 아이디어는 다음과 같다.
- [0, k] 를 커버하는 배열이 존재한다고 가정해보자. 이 범위를 증가시키 위해서는 x (1 ≤ x ≤ k+1)의 값이 필요하다. 이 범위의 값을 추가하면 기존에 비해 증가된 [0, k+x]의 범위를 커버할 수 있다.
nums = [1, 5, 10], n = 20 인 상황을 생각해보자.
[0, 0]의 범위를 nums를 활용하여 최소 [0, 20]으로 만드는 것이 목표이다. 위의 아이디어를 활용하여 문제를 풀면 다음과 같다.
- [0, 0]을 증가시키기 위해 필요한 x: 1 ≤ x ≤ 1, nums에 있는가? Yes => nums[0] => [0, 1]
- [0, 1]을 증가시키기 위해 필요한 x: 1 ≤ x ≤ 2, nums에 있는가? No => 2 추가 => [0, 3]
- 이전에 사용한 nums의 값은 없는 것으로 취급
- 필요한 범위 중 가능한 가장 큰 값을 추가 => 커버 영역을 되도록 많이 증가 => 추가하는 횟수를 최소로 만들기 위함
- [0, 3]을 증가시키기 위해 필요한 x: 1 ≤ x ≤ 4, nums에 있는가? No => 4 추가 => [0, 7]
- [0, 7]을 증가시키기 위해 필요한 x: 1 ≤ x ≤ 8, nums에 있는가? Yes => nums[1] => [0, 13]
- [0, 13]을 증가시키기 위해 필요한 x: 1 ≤ x ≤ 14, nums에 있는가? Yes => nuns[2] => [0, 23]
위 방식을 코드로 작성하는데 필요한 부분에 대해 생각해보자.
먼저, 커버 영역을 증가시키기 위해 필요한 범위에서 실제적으로 필요한 값은 가장 큰 값이다. 즉, [0, k] 영역을 커버하고 있다면 k+1의 값을 추가하는 것이 어떤 값을 추가하는 것보다 범위를 크게 늘리기 때문이다.
하지만!! 현재 nums에서 사용하지 않은 값 중에서 k+1보다 작은 값이 존재한다면, 해당 값을 먼저 활용하여 범위를 늘려야 한다. 이 과정은 nums가 정렬되어 있다는 것을 활용하여 접근할 수 있다. 위 예시에서도 nums의 값을 순차적으로 활용한 것을 볼 수 있다.
이러한 내용을 코드로 작성하면 다음과 같다.
var minPatches = function(nums, n) { let answer = 0; let covered = 0; let i = 0; while (covered < n) { if (i >= nums.length || nums[i] > covered + 1) { answer += 1; covered += (covered + 1) } else { covered += nums[i]; i += 1; } } return answer; };
Github: 330.js
GitHub - opwe37/Algorithm-Study
Contribute to opwe37/Algorithm-Study development by creating an account on GitHub.
github.com
'알고리즘 문제 풀이' 카테고리의 다른 글
[LeetCode] 153. Find Minimum in Rotated Sorted Array (0) 2021.09.01 [LeetCode] 598. Range Addition II (0) 2021.08.31 [LeetCode] 331. Verify Preorder Serialization of a Binary Tree (0) 2021.08.27 [LeetCode] 633. Sum of Square Numbers (0) 2021.08.26 [LeetCode] 537. Complex Number Multiplication (0) 2021.08.25