문제 설명
n개의 양수 요소의 배열이 제공됩니다. 배열에서 요소 쌍에 의해 생성된 최대 비트 AND 값을 찾아야 합니다.
예
입력 배열이 {10, 12, 15, 18}이면 비트 AND의 최대값은 12입니다.
알고리즘
단일 비트에 대한 비트 AND 연산의 결과는 두 비트가 모두 1일 때 최대입니다. 이 속성을 고려하면 -
- MSB에서 시작하여 설정된 값을 갖는 배열 요소가 최소 두 개 이상 있는지 확인합니다.
- 예인 경우 해당 MSB는 솔루션의 일부가 되고 결과에 추가됩니다. 그렇지 않으면 해당 비트를 폐기합니다.
- 마찬가지로, 비트 위치에 대해 MSB에서 LSB(32에서 1)로 반복하면 어떤 비트가 솔루션의 일부가 될지 쉽게 확인할 수 있으며 이러한 모든 비트를 솔루션에 계속 추가할 것입니다.
예
이제 예를 살펴보겠습니다 -
#include <bits/stdc++.h> using namespace std; int checkBits(int *arr, int n, int pattern) { int cnt = 0; for (int i = 0; i < n; ++i) { if ((pattern & arr[i]) == pattern) { ++cnt; } } return cnt; } int getMaxBitwiseAnd(int *arr, int n) { int result = 0; int count; for (int i = 31; i >= 0; --i) { count = checkBits(arr, n, result | (1 << i)); if (count >= 2) { result |= (1 << i); } } return result; } int main() { int arr[] = {10, 12, 15, 18}; int n = sizeof(arr) / sizeof(arr[0]); cout << "Maximum bitwise AND = " << getMaxBitwiseAnd(arr, n) << endl; return 0; }
출력
Maximum bitwise AND = 12