หลักการ: Divisibility by 3
เลขหาร 3 ลงตัว ⇔ ผลรวมของหลักเลขหาร 3 ลงตัว
ไม่สนใจลำดับตัวเลข เพราะการจัดเรียงใหม่ไม่เปลี่ยนผลรวมหลักเลข
ตัวอย่างโค้ด
public class Demo {
public static boolean canFormDivisibleBy3(int[] digits) {
int sum = 0;
for (int d : digits) {
// ถ้าแต่ละ element เป็น digit เดียว (0-9) ใช้ได้เลย
// ถ้าเป็น multi-digit numbers ต้องแยกหลักก่อน
sum += d;
}
return sum % 3 == 0;
}
// ถ้า array มีตัวเลขหลายหลัก ต้องแยก digits ก่อน
public static boolean canFormDivisibleBy3FromNumbers(int[] numbers) {
int sum = 0;
for (int num : numbers) {
int n = Math.abs(num); // handle negative
if (n == 0) { sum += 0; continue; }
while (n > 0) {
sum += n % 10;
n /= 10;
}
}
return sum % 3 == 0;
}
public static void main(String[] args) {
int[] arr1 = {66, 90, 87, 33, 123}; // digits sum = 6+6+9+0+8+7+3+3+1+2+3 = 48 → divisible by 3
System.out.println("Array 1: " + Arrays.toString(arr1) + " → " + canFormDivisibleBy3FromNumbers(arr1));
int[] arr2 = {1, 2, 4}; // sum = 7 → not divisible
System.out.println("Array 2: " + Arrays.toString(arr2) + " → " + canFormDivisibleBy3FromNumbers(arr2));
}
}
ผลลัพธ์
Array 1: [66, 90, 87, 33, 123] → true Array 2: [1, 2, 4] → false
Complexity
- Time: O(total digits) - ต้องอ่านทุกหลักเลข
- Space: O(1)
ขยาย: สร้างเลขที่หาร 3 ลงตัวจริงๆ
// เรียง digits ใหญ่ไปเล็ก → ใหญ่ที่สุด
// เรียง digits เล็กไปใหญ่ → เล็กที่สุด (leading zero ไม่ได้)
// ต้องมี 0 อย่างน้อย 1 ตัวสำหรับเลขหลายหลัก