λ¬Έμ λ§ν¬
https://leetcode.com/problems/check-if-array-pairs-are-divisible-by-k/
λ¬Έμ μμ½
μμκ° μ«μμΈ λ°°μ΄ arr
μ΄ μκ³ λ°°μ΄μ κΈΈμ΄μΈ n
μ μ§μ
μ΄κ³ k
κ° μ£Όμ΄μ§λ€.
μ΄λ, λ°°μ΄μ μ ννκ² n/2
μ pair κ° λμ΄μΌ νκ³ pair κ° λ μ«μμ ν© μ΄ k
λ‘ λλμ΄μ ΈμΌ νλ€.
λ°λΌμ, λ°°μ΄μμ λ κ°μ μ«μλ₯Ό κ³¨λΌ κ·Έ ν©μ΄ k
λ‘ λλμ΄μ§λ©΄ pair
κ° λκ³
λ°°μ΄μ λͺ¨λ μμκ° pair κ° λλ©΄ True
, μλλ©΄ False
λ₯Ό μΆλ ₯νλ©΄ λλ€.
( arr[a] + arr[b] ) // k == True
( arr[a] + arr[b] ) // k != False
λ¬Έμ νμ΄
μ²μμλ νλμ μμλ₯Ό κ°μ Έμ λ€λ₯Έ μμμ λΉκ΅ν΄κ°λ©° λ μμ ν©μ΄ k λ‘ λλμ΄μ§λ€λ©΄ True, κ·Έλ μ§ μλ€λ©΄ False λ‘ νλ €κ³ νμλ€.
νμ§λ§ μ΄λ κ² νκ² λλ©΄ μκ° λ³΅μ‘λκ° O(n^2)
μ΄ λμ΄ μκ° μ ν μ΄κ³Όλ‘ μ€ν¨νκ² λμλ€.
-
μλͺ»λ μ μΆ μ½λ
class Solution: def canArrange(self, arr: List[int], k: int) -> bool: for i in range(len(arr)): check = False for j in range(len(arr)): sum_args = arr[i] + arr[j] if sum_args % k == 0: arr[i] = 0 arr[j] = 0 check = True if check is False: return False return True
κ·Έλμ μ²μλΆν° λ€μ μ κ·Όνκ² λμλ€.
λ μμ ν©μ΄ k λ‘ λλμ΄μ ΈμΌ νλ€.
μμ λ§μ μ‘°κΈ λ νμ΄μ μ€λͺ νμλ©΄ κ° μ«μμ λλ¨Έμ§μ ν©μ΄ 0 λλ k κ° λλ€λ©΄ k λ‘ λλμ΄μ§λ€κ³ λ§ν μ μκ² λλ€.
κ·Έλμ 2κ°μ§μ μΌμ΄μ€λ‘ ꡬλΆν΄λ³Ό μ μμλ€.
λλ¨Έμ§μ ν©μ΄ 0 μΈ κ²½μ°
λλ¨Έμ§μ ν©μ΄ 0 μ΄λΌλ λ§μ λ μμ ν©μ΄ k λ‘ λλμ΄μ§λ€λ λ§μ΄ λμ΄ pair κ° λλ€.λλ¨Έμ§μ ν©μ΄ k μΈ κ²½μ°
λλ¨Έμ§μ ν©μ λ€μ k λ‘ λλκ² λμ΄ 0 μ΄ λλ€λ©΄ k λ‘ λλμ΄μ§ μ μλ€λ©΄ pair κ° λλ€.
μ΄ λ§μ μμΌλ‘ λνλ΄λ³΄μλ©΄ λ€μκ³Ό κ°λ€.
(a % k) + ( b % k ) % k == 0
μλ₯Ό λ€μ΄ μ€λͺ
ν΄λ³΄λ©΄ λ μ΄ν΄κ° μ¬μΈ κ² κ°μμ μλ₯Ό λ€μ΄λ³΄μλ€.
λ§μ½ k μ κ°μ΄ 5
μ΄κ³ λ°°μ΄ [1, 3, 5, 7, 9]
κ° μλ€κ³ ν λ λ κ°μ μ«μ 3
κ³Ό 7
μ κ°μ Έμμ pair κ° λλμ§ νμΈν΄λ³Έλ€κ³ κ°μ νμ.
λ¨Όμ λ μμ λλ¨Έμ§λ₯Ό ꡬνλ€.
3 % 5 = 3
7 % 5 = 2
λ€μμΌλ‘ λ μμ λλ¨Έμ§ ν©μ ꡬνλ€.
3 + 2 = 5
λ μμ λλ¨Έμ§μ ν©μ΄ 5 == k
μ΄λ―λ‘ 3
κ³Ό 7
μ k μΈ 5
λ‘ λλμ΄μ§λ pair κ° λ μ μλ€.
νλμ μλ₯Ό λ λ€μλ©΄, 5
μ 10
μ΄ μ‘΄μ¬νλ€κ³ ν κ²½μ° λ μμ λλ¨Έμ§λ 0
, 0
μ΄ λκ³
λλ¨Έμ§μ ν©μ΄ 0μ΄κΈ° λλ¬Έμ k λ‘ λλμ΄μ§λ pair λΌκ³ ν μ μλ€.
κ·Έλμ κ²°λ‘ μ μ΄λ€ μ«μμ λλ¨Έμ§ remain
μ΄ μμ λ k - remain
μ ν©μ΄ 0
λλ k
λΌλ©΄ pair
κ° λλ€κ³ κ°μ ν μ μλ€.
κ·Έλ¦¬κ³ μ¬κΈ°μ ν κ°μ§ λ μ€μν μ μ pair λΌλ λ§μ μ§μμ΄κΈ° λλ¬Έμ μ§μ λ§νΌμ μ«μκ° μλ€λ©΄ pair κ° λ μ μλ€λ μ λ μ μν΄μΌ νλ€.
μ΄λ¬ν κ³Όμ μ μ½λλ‘ νμ΄μ μ μ΄λ³΄μλ€.
λ¨Όμ , λ°°μ΄ μμ μλ μ«μλ€μ λλ¨Έμ§μ κ°―μλ₯Ό μΈμ΄μ£Όμλ€.
remain_count = {i:0 for i in range(k)}
for num in arr:
k_remain = num % k
remain_count[k_remain] += 1
μ΄λ, key μ κ°μ k
μ λλ¨Έμ§ κ°μ λ²μμΈ 0 ~ k-1
μ΄ λλ€.
μ΄μ μμμ λ§ν 2κ°μ§ κ²½μ°μ λν΄μ μ½λλ‘ μμ±ν΄μ£Όλ©΄ λλ€.
for remain in remain_count.keys():
# k λ‘ λλμ΄μ§λ μμΈ κ²½μ°(λλ¨Έμ§κ° 0μΈ κ²½μ°)
# pair λ₯Ό λ§λ€κΈ° μν΄μ μ§μ κ°κ° νμνλ€.
if remain == 0:
if remain_count[remain] % 2 != 0:
return False
else:
# λλ¨Έμ§μ ν©μ΄ k κ° λμ΄μΌ νκΈ° λλ¬Έμ (λλ¨Έμ§) μ κ°μμ (k - λλ¨Έμ§) μ κ°μκ° κ°μμΌ pair κ° λλ€.
if remain_count[remain] != remain_count[k - remain]:
return False
μ μΆ λ΅μ
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
remain_count = {i:0 for i in range(k)}
for num in arr:
k_remain = num % k
remain_count[k_remain] += 1
for remain in remain_count.keys():
# k λ‘ λλμ΄μ§λ μμΈ κ²½μ°(λλ¨Έμ§κ° 0μΈ κ²½μ°)
# pair λ₯Ό λ§λ€κΈ° μν΄μ μ§μ κ°κ° νμνλ€.
if remain == 0:
if remain_count[remain] % 2 != 0:
return False
else:
# λλ¨Έμ§μ ν©μ΄ k κ° λμ΄μΌ νκΈ° λλ¬Έμ (λλ¨Έμ§) μ κ°μμ (k - λλ¨Έμ§) μ κ°μκ° κ°μμΌ pair κ° λλ€.
if remain_count[remain] != remain_count[k - remain]:
return False
return True