เราได้รับอาร์เรย์สองชุด arr_1[] และ arr_2[] ที่มีค่าจำนวนเต็ม งานคือการนับจำนวนคู่ที่แตกต่างกัน (distinct pairs) ที่มีผลรวมของตัวเลข (sum of digits) เท่ากัน โดยเลือกค่าหนึ่งจาก arr_1 และอีกค่าหนึ่งจาก arr_2
ตัวอย่าง
Input − int arr_1[] = {1, 22, 42, 17} Int arr_2[] = {1, 31, 6, 8} Output − count is 4
คำอธิบาย − มี 4 คู่ที่มีผลรวมตัวเลขเท่ากัน คือ (1,1), (22,31), (42,6), (17,8)
Input − int arr_1[] = {1, 22, 42, 17} Int arr_2[] = {2, 78, 6, 18} Output − count is 1
คำอธิบาย − มีเพียงคู่เดียวคือ (42,6) ที่มีผลรวมตัวเลขเท่ากัน
Input − int arr_1[] = {1, 22, 42, 17} Int arr_2[] = {2, 78, 16, 18} Output − count is 0
คำอธิบาย − ไม่มีคู่ใดที่มีผลรวมตัวเลขเท่ากัน
แนวทางการแก้ปัญหา
- สร้างอาร์เรย์สองชุด arr_1[] และ arr_2[]
- คำนวณขนาดของทั้งสองอาร์เรย์
- ใช้ set เพื่อเก็บคู่ที่ไม่ซ้ำกัน (pair<int, int>)
- วนลูป i สำหรับ arr_1 และลูป j สำหรับ arr_2
- คำนวณผลรวมตัวเลขของแต่ละค่า
- ถ้าผลรวมเท่ากัน ให้เพิ่มคู่เข้า set (เรียงค่าน้อยก่อนเพื่อป้องกันซ้ำ)
- คืนค่าขนาดของ set
ตัวอย่างโค้ด C++
#include <iostream>
#include <set>
using namespace std;
int sumDigits(int n) {
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
int pairCount(int arr1[], int arr2[], int size1, int size2) {
set> mySet;
for (int i = 0; i < size1; i++) {
for (int j = 0; j < size2; j++) {
if (sumDigits(arr1[i]) == sumDigits(arr2[j])) {
if (arr1[i] < arr2[j])
mySet.insert({arr1[i], arr2[j]});
else
mySet.insert({arr2[j], arr1[i]});
}
}
}
return mySet.size();
}
int main() {
int arr1[] = {1, 22, 42, 17};
int arr2[] = {5, 31, 6, 8};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
int size2 = sizeof(arr2) / sizeof(arr2[0]);
cout << "count is " << pairCount(arr1, arr2, size1, size2);
return 0;
}
ผลลัพธ์
count is 3
บทความนี้อธิบายวิธีนับคู่ที่ไม่ซ้ำกันจากสองอาร์เรย์ที่มีผลรวมของหลักตัวเลขเท่ากัน โดยใช้ฟังก์ชันคำนวณผลรวมตัวเลขและ set เพื่อกำจัดคู่ซ้ำ