LV. Medium 🧐
https://leetcode.com/problems/partition-equal-subset-sum/
문제
Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
Example 1:
Input: nums = [1,5,11,5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: nums = [1,2,3,5]
Output: false
Explanation: The array cannot be partitioned into equal sum subsets.
Constraints:
- 1 <= nums.length <= 200
- 1 <= nums[i] <= 100
문제 해결법
1. nums의 총합이 짝수여야 된다(2개의 조합으로 나누기 때문) -> 홀수면 false 리턴!
2. dp로 문제를 풀면 된다
(sum / 2) 가 하나의 조합에서 나와야되는 합계이다
sum이 20이라고 생각하고 1 ~ (sum / 2)인 bool 배열을 만들고 다 false로 채워보자
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
nums[0] = 2 이면 1개로 만들 수 있는 합계의 조합은 2이다 -> 만들 수 있는 수를 true로 바꾸기
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
nums[1] = 1 이면 2개로 만들 수 있는 합계의 조합은 1, 2, 3이다
2는 이미 true로 되어있고, 1은 nums[1]의 값이니깐 true로 바꾸고,
그렇다면 3은 어떻게 나온것일까?
10부터 1까지 역순으로 돌면서 true인 값을 찾는다
이미 true인 값은 이전의 수로 만들 수 있는 조합의 합계이므로, true인 값 + 현재 nums의 값 = 만들 수 있는 조합의 합계가 된다
이런 식으로 nums배열을 다 돌려서 10이 true가 되었다면 nums의 조합으로 sum / 2의 값을 만들 수 있다는 것!!
해결 코드
class Solution {
private:
int sum;
public:
bool canPartition(vector<int>& nums) {
sum = 0;
for (int i = 0; i < nums.size(); ++i)
sum += nums[i];
if (sum % 2 == 1)
return false;
// 만들 수 있는 조합들의 합계 저장할 백터
vector<bool>check(sum + 1, false);
check[0] = true;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] > sum / 2)
return false;
for (int j = sum / 2; j >= nums[i]; --j) {
check[j] = check[j] || check[j - nums[i]];
}
}
return check[sum / 2];
}
};
'Computer Science > 알고리즘' 카테고리의 다른 글
leetcode 143) Reorder List (0) | 2022.01.06 |
---|---|
leetcode 231) Power of Two (0) | 2022.01.05 |
leetcode 221) Maximal Square (0) | 2022.01.04 |
leetcode 878) Nth Magical Number (0) | 2022.01.03 |
leetcode 790) Domino and Tromino Tiling (0) | 2022.01.02 |
댓글