Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 비트 OR(Bitwise OR) 연산으로 짝수가 되는 쌍 개수 구하기

문제 개요

정수 배열이 하나 주어졌을 때, 배열의 값들을 이용해 만들 수 있는 모든 쌍(pair) 가운데 두 원소에 비트 OR(Bitwise OR) 연산을 적용한 결과가 짝수가 되는 쌍의 총 개수를 구하는 것이 이번 글의 목표입니다.

먼저 OR 연산의 진리표부터 살펴보겠습니다.

ABA ∨ B
000
101
011
111

진리표에서 알 수 있듯이 OR 연산은 두 비트 중 하나라도 1이면 결과가 1이 됩니다. 여기서 핵심은, 두 수의 OR 결과가 짝수가 되려면 최하위 비트(LSB)가 0이어야 한다는 점이며, 이는 두 수가 모두 짝수일 때만 가능하다는 의미입니다. 반대로 쌍 안에 홀수가 하나라도 포함되면 OR 결과는 반드시 홀수가 됩니다.

입력 · 출력 예시

입력 − int arr[] = {2, 5, 1, 8, 9}

출력 − 비트 OR 결과가 짝수인 쌍의 개수 − 1

설명

a1a2a1 ∨ a2
257
213
2810 (짝수)
2911
515
5813
5913
189
199
899

모든 쌍을 검사해 보면 (2, 8) 한 쌍만 OR 결과가 10으로 짝수이고, 나머지 쌍은 모두 홀수가 됩니다. 이처럼 OR 결과가 짝수가 되려면 두 원소가 모두 짝수여야 한다는 규칙을 확인할 수 있습니다.

풀이 접근 방법

  • 쌍을 만들 정수 요소로 이루어진 배열을 입력받습니다.
  • 배열의 크기를 계산한 뒤, 이후 처리를 위해 함수에 데이터를 전달합니다.
  • OR 연산 결과가 짝수가 되는 쌍의 개수를 저장할 임시 변수 count를 선언합니다.
  • i를 0부터 배열 크기까지 순회하는 FOR 루프를 시작합니다.
  • 루프 내부에서 arr[i] & 1 == FALSE, 즉 현재 원소가 짝수이면 count를 1 증가시킵니다.
  • count 값을 count * (count - 1) / 2로 갱신합니다. 이는 짝수 원소 n개 중 2개를 뽑는 조합 공식 nC2 = n(n-1)/2와 동일합니다.
  • count를 반환합니다.
  • 결과를 출력합니다.

즉, 배열 전체를 일일이 비교하지 않고 짝수 원소의 개수만 센 뒤 조합 공식을 적용하면 답을 바로 구할 수 있습니다.

예제 코드

#include <iostream>
using namespace std;
// 비트 OR 결과가 짝수인 쌍의 개수를 계산합니다
int count_pair(int arr[], int size){
    int count = 0;
    for (int i = 0; i < size; i++){
        if(!(arr[i] & 1)){
            count++;
        }
    }
    count = count * (count - 1) / 2;
    return count;
}
int main(){
    int arr[] = {2, 5, 1, 8, 9, 2, 7};
    int size = sizeof(arr) / sizeof(arr[0]);
    cout<<"Count of pairs with Bitwise OR as Even number are: "<<count_pair(arr, size) << endl;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −

Count of pairs with Bitwise OR as Even number are: 3

배열 {2, 5, 1, 8, 9, 2, 7}에는 짝수가 3개(2, 8, 2) 있으므로, 이들 중 2개를 뽑는 조합의 수는 3 × 2 ÷ 2 = 3이 됩니다. 실제로 (2, 8), (2, 2), (8, 2) 세 쌍 모두 OR 결과가 짝수입니다.

복잡도 분석

  • 시간 복잡도: O(n) − 배열을 한 번만 순회하며 짝수 원소의 개수를 세면 됩니다.
  • 공간 복잡도: O(1) − 카운터 변수 외에 추가적인 메모리가 필요하지 않습니다.