3068 - Find the Maximum Sum of Node Values
info
- 문제 보기: 3068 - Find the Maximum Sum of Node Values
- 소요 시간: 21분 18초
- 풀이 언어:
java
- 체감 난이도: 4️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
비트 조작
정렬
그리디
풀이 코드
info
- 메모리: 56000 KB
- 시간: 7 ms
class Solution {
public long maximumValueSum(int[] nums, int k, int[][] edges) {
// 1. pre-calc XOR diff values
int[] diff = new int[nums.length];
for (int i = 0; i < nums.length; ++i) diff[i] = (nums[i] ^ k) - nums[i];
// 2. get max sum
long ans = 0;
for (int n : nums) ans += n;
// sort desc
// diff = Arrays.stream(diff).boxed().sorted(Collections.reverseOrder()).mapToInt(i->i).toArray();
// sort asc
Arrays.sort(diff);
for (int i = diff.length-1; 0 < i; i-=2) {
int diffSum = diff[i] + diff[i-1];
if (0 < diffSum) ans += diffSum;
else break;
}
return ans;
}
}
풀이 해설
Bit Manipulation과 Greedy 알고리즘을 이용해서 풀 수 있는 문제이다.
🔮 XOR 트릭
XOR 연산의 특징 상 (a ^ b) ^ b = a 이므로
한 번 XOR 연산한 nums[i]
는 재연산할 필요가 없음을 알 수 있다.