Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 하나의 빈도가 최소한 다른 값의 값이 되도록 배열의 카운트 쌍

<시간/>

양의 정수 배열이 제공됩니다. 목표는 A의 빈도가 B 배이고 B의 빈도가 A인 쌍에 요소( A, B )가 있도록 arr[] 요소의 쌍 수를 찾는 것입니다.

예를 들어 이해합시다.

입력 - 정수 arr[] ={ 3, 3, 3, 5, 5, 6, 6}

출력 − 하나의 빈도가 다른 하나의 값 이상인 배열의 쌍 수는 − 1

설명 - 배열에서 A가 B번 발생하고 B가 A번 발생하는 배열의 유효한 쌍은 (3, 3)입니다. 3은 배열에서 3번 발생하기 때문입니다. 따라서 유효한 쌍은 하나만 있으므로 개수는 1입니다.

입력 - 정수 arr[] ={ 3, 3, 3, 3, 3, 5, 5, 5, 6, 6}

출력 − 하나의 빈도가 다른 하나의 값 이상인 배열의 쌍 수는 − 1

설명 - 배열에서 A가 B번 발생하고 B가 A번 발생하는 배열의 유효한 쌍은 배열에서 3이 5번 발생하고 5가 3번 발생하므로 (3, 3), (5, 5) 및 (3, 5)입니다. . 따라서 세 개의 유효한 쌍이 있으므로 개수는 3입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

접근 방식에서 우리는 먼저 배열 요소의 빈도를 포함하는 정렬되지 않은 맵을 만들고 채웁니다. for 루프를 사용하여 unordered_map을 탐색합니다. 각 요소 및 해당 빈도에 대해 빈도가 더 많이 발견되면 쌍의 수를 증가시킵니다.

  • 정수 배열 arr[]을 가져옵니다.

  • 함수 frequency_other_value(int arr[], int size)는 배열과 배열의 크기를 사용하여 쌍이 (A,B)가 되도록 쌍의 개수를 반환합니다. 여기서 A는 최소 B번 발생하고 그 반대도 마찬가지입니다.

  • 초기 카운트를 0으로 합니다.

  • arr[]의 요소와 해당 빈도에 대해 unordered_map um을 사용합니다.

  • for 및 쌍 start=it.second의 첫 번째 값 각각에 대해 사용하는 트래버스 맵; (it=iterator), 주파수에 대한 트래버스 맵>=for 루프 사용 시작

  • 이러한 쌍에 대한 증분 수.

  • 결과로 카운트를 반환합니다.

예시

#include <bits/stdc++.h>
using namespace std;
int frequency_other_value(int arr[], int len){
   int count = 0;
   unordered_map<int, int> um;
   for (int i = 0; i < len; ++i){
      um[arr[i]]++;
   }
   for (auto it : um){
      int start = it.first;
      int end = it.second;
      for (int j = 1; j <= end; j++){
         if (um[j] >= start){
            count++;
         }
      }
   }
   return count;
}
int main(){
   int arr[] = { 3, 3, 3, 5, 5, 6, 6};
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of pairs in an array such that frequency of one is at least value of other are: "<<frequency_other_value(arr, size);
   return 0;
}

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

Count of pairs in an array such that frequency of one is at least value of other are: 1