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

C++로 두 배열에서 자릿수 합이 같은 고유한 쌍 개수 구하기

정수 값으로 이루어진 두 배열 arr_1[]과 arr_2[]가 주어졌을 때, 자릿수 합이 서로 같은 고유한 쌍(distinct pair)의 개수를 계산하는 것이 목표입니다. 즉, arr_1[]에서 한 값을, arr_2[]에서 다른 한 값을 선택하여 쌍을 만들고, 선택된 두 값의 각 자릿수 합이 동일해야 합니다.

배열(array)은 동일한 타입의 요소들을 고정된 크기로 순차적으로 저장할 수 있는 기본적인 데이터 구조입니다. 배열은 데이터 모음을 저장하는 용도로 사용되지만, 실무에서는 같은 타입의 변수들이 모인 집합으로 이해하는 것이 더 직관적이고 유용합니다.

예시

입력 − int arr_1[] = {1, 22, 42, 17}
    int arr_2[] = {1, 31, 6, 8}
출력 − 개수는 4

설명 − 자릿수 합이 같은 쌍은 총 4개로, (1, 1), (22, 31), (42, 6), (17, 8)입니다.

입력 − int arr_1[] = {1, 22, 42, 17}
    int arr_2[] = {2, 78, 6, 18}
출력 − 개수는 1

설명 − 자릿수 합이 같은 쌍은 (42, 6) 하나뿐이므로 개수는 1입니다.

입력 − int arr_1[] = {1, 22, 42, 17}
    int arr_2[] = {2, 78, 16, 18}
출력 − 개수는 0

설명 − 자릿수 합이 같은 쌍이 하나도 없으므로 개수는 0입니다.

프로그램에 적용된 접근 방식

  • 두 개의 배열 arr_1[]과 arr_2[]를 생성합니다.

  • length() 함수(또는 sizeof 연산자)를 사용해 각 배열의 길이를 계산합니다. 이 함수는 배열에 포함된 요소 수에 해당하는 정수 값을 반환합니다.

  • 중복 쌍을 제거하기 위해 set 타입의 변수(예: myset)를 생성합니다.

  • i를 0부터 arr_1[]의 크기 미만까지 반복하는 외부 루프를 시작합니다.

  • 외부 루프 안에서 j를 0부터 arr_2[]의 크기 미만까지 반복하는 내부 루프를 시작합니다.

  • sumdigits(arr_1[i]) == sumdigits(arr_2[j])인지 확인한 후, arr_1[i]가 arr_2[j]보다 작으면 make_pair(arr_1[i], arr_2[j])를 set에 삽입합니다.

  • 그렇지 않으면 make_pair(arr_2[j], arr_1[i])를 삽입하여 항상 (작은 값, 큰 값) 순서로 저장함으로써 중복을 방지합니다.

  • 모든 반복이 끝나면 st.size()를 반환합니다.

  • 결과를 출력합니다.

예제 코드

#include <iostream>
#include <set>
using namespace std;
// 숫자의 각 자릿수 합을 구하는 함수
int sumdigits(int n){
    int sum = 0;
    while (n > 0){
       sum += n % 10;
       n = n / 10;
    }
    return sum;
}
// 자릿수 합이 같은 쌍의 개수를 세는 함수
int paircount(int arr_1[], int arr_2[], int size1, int size2){
    // 중복 쌍을 피하기 위해 set 사용
    set<pair<int, int> > myset;
    for (int i = 0; i < size1; i++){
       for (int j = 0; j < size2; j++){
          // 두 요소의 자릿수 합 비교
          if (sumdigits(arr_1[i]) == sumdigits(arr_2[j])){
             if (arr_1[i] < arr_2[j]){
                myset.insert(make_pair(arr_1[i], arr_2[j]));
             } else{
                myset.insert(make_pair(arr_2[j], arr_1[i]));
             }
          }
      }
   }
   // set의 크기를 반환
   return myset.size();
}
// 드라이버 코드
int main(){
   int arr_1[] = { 1, 22, 42, 17 };
   int arr_2[] = { 5, 31, 6, 8 };
   int size1 = sizeof(arr_1) / sizeof(arr_1[0]);
   int size2 = sizeof(arr_2) / sizeof(arr_2[0]);
   cout << "count is " << paircount(arr_1, arr_2, size1, size2);
   return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다 −

count is 3

이 예제에서 자릿수 합이 같은 쌍은 (22, 31), (42, 6), (17, 8)로 총 3개입니다. set을 활용하면 동일한 쌍이 여러 번 발견되더라도 자동으로 중복이 제거되므로, 별도의 추가 검사 없이 정확한 고유 쌍의 개수를 얻을 수 있다는 점이 이 접근 방식의 핵심 장점입니다.