정수 값으로 이루어진 두 배열 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을 활용하면 동일한 쌍이 여러 번 발견되더라도 자동으로 중복이 제거되므로, 별도의 추가 검사 없이 정확한 고유 쌍의 개수를 얻을 수 있다는 점이 이 접근 방식의 핵심 장점입니다.