1814. Count Nice Pairs in an Array

  • μ›λž˜ μˆ«μžμ™€ 뒀집은 숫자의 합이 같은 두 숫자의 쌍 개수λ₯Ό κ΅¬ν•˜λŠ” 문제.
    • 쑰건을 ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.
      • nums[i] + rev(nums[j]) == rev(nums[i]) + nums[j]
    • μœ„ 쑰건을 λ³€ν˜•ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.
      • nums[i] - rev(nums[i]) == nums[j] - rev(nums[j])
    • ν•œλ§ˆλ””λ‘œ λ§ν•˜λ©΄ μ›λž˜ 숫자, 뒀집은 숫자의 차이가 같은 두 index 쌍의 개수λ₯Ό κ΅¬ν•˜λ©΄ λœλ‹€.
  • ν’€μ΄λŠ” λ‹€μŒκ³Ό 같이 이루어진닀.
    • λ¨Όμ € μ›λž˜ 숫자, 뒀집은 숫자의 차이λ₯Ό κ³„μ‚°ν•œλ‹€. μ›λž˜ μˆ«μžλŠ” ν•„μš”μ—†κΈ° λ•Œλ¬Έμ— nums에 차이 값을 λ‹€μ‹œ μ €μž₯ν•œλ‹€.
    • κ·Έ 차이 κ°’ 숫자λ₯Ό μ •λ ¬ν•œλ‹€.
    • λ§ˆμ§€λ§‰μ— 더미 κ°’ (λ§ˆμ§€λ§‰ κ°’ + 1)을 μΆ”κ°€ν•œλ‹€.
      • 루프 λ°–μ—μ„œ λ§ˆμ§€λ§‰ κ°’ ν•­λͺ©μ— λŒ€ν•œ 값을 λ”°λ‘œ 계산해도 λ˜μ§€λ§Œ 쀑볡 μ½”λ“œκ°€ μƒκΈ°λ―€λ‘œβ€¦
    • nums에 μžˆλŠ” 차이 값듀을 μˆœνšŒν•˜λ©΄μ„œ λ™μΌν•œ κ°’λ“€μ˜ 숫자λ₯Ό μ„Έκ³  이λ₯Ό λ°”νƒ•μœΌλ‘œ index 쌍 μ‘°ν•©μ˜ 개수λ₯Ό κ³„μ‚°ν•œλ‹€.
      • numsκ°€ μ •λ ¬λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— λ™μΌν•œ κ°’λ“€ 끼리 λΆ™μ–΄μžˆκ²Œ λœλ‹€. λ”°λΌμ„œ 값이 λ‹¬λΌμ§ˆ λ•ŒκΉŒμ§€ 숫자의 개수λ₯Ό μ„Έλ©΄ λ™μΌν•œ κ°’λ“€μ˜ 숫자λ₯Ό μ…€ 수 μžˆλ‹€.
      • 차이 값이 λ™μΌν•œ k개의 indexκ°€ μžˆμ„λ•Œ κ·Έ 쀑에 2개 값을 κ³¨λΌμ„œ μŒμ„ λ§Œλ“€λ©΄ k x (k - 1) / 2 κ°œκ°€ λœλ‹€.
      • κ³±ν•˜κΈ° μ—°μ‚°μ—μ„œ overflowκ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ long long 으둜 casting ν•œλ‹€.
      • κ³±ν•œ κ²°κ³Ό, 그리고 κ²°κ³Ό κ°’ λ”ν•˜λŠ” λΆ€λΆ„μ—μ„œ overflowκ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ 1e9 + 7둜 λͺ¨λ“ˆλŸ¬ 연산을 ν•œλ‹€.
class Solution { public: static constexpr int MOD = 1e9 + 7; int rev(int v) { int result = 0; while (v > 0) { result *= 10; result += v % 10; v /= 10; } return result; } int countNicePairs(vector<int>& nums) { for (int i = 0; i < nums.size(); ++i) { nums[i] = nums[i] - rev(nums[i]); } sort(nums.begin(), nums.end()); nums.push_back(nums.back() + 1); int count = 0; int prev = 0; int result = 0; for (auto diff : nums) { if (diff != prev) { int subResult = ( count * static_cast<long long>(count - 1) / 2 ) % MOD; result = (result + subResult) % MOD; count = 0; } prev = diff; ++count; } return result; } };