2870. Minimum Number of Operations to Make Array Empty

  • λ°°μ—΄μ—μ„œ λ™μΌν•œ 숫자λ₯Ό 2개 λ˜λŠ” 3κ°œμ”© λ¬Άμ–΄μ„œ μ œκ±°ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμ„ λ•Œ 배열을 빈 μƒνƒœλ‘œ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ μ΅œμ†Œμ˜ μž‘μ—… μˆ˜λŠ” μ–Όλ§ˆμΈμ§€ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
  • 각 μˆ«μžλ³„λ‘œ μΆœν˜„ λΉˆλ„λ₯Ό μ„Έμ–΄μ„œ μ €μž₯ν•˜λŠ” 방법도 μžˆκ² μ§€λ§Œ λ³„λ„μ˜ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • 배열을 μ •λ ¬ν•˜μ—¬ μ—°μ†λœ 동일 숫자λ₯Ό μ„Έλ©΄ λ³„λ„μ˜ λ©”λͺ¨λ¦¬ 곡간 없이 문제λ₯Ό ν’€ 수 μžˆλ‹€.
  • 쑰금 ν—·κ°ˆλ Έλ˜ 뢀뢄은 2κ°œμ”© 묢은 μž‘μ—…μ˜ 수, 3κ°œμ”© 묢은 μž‘μ—…μ˜ 수λ₯Ό μ–΄λ–»κ²Œ μ„Έμ–΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•œ κ²ƒμ΄μ—ˆλ‹€.
    • κ°€λŠ₯ν•˜λ‹€λ©΄ 3κ°œμ”© λ¬Άμ–΄μ„œ μ œκ±°ν•˜λŠ” 것이 μ΅œμ†Œμ˜ μž‘μ—… 수λ₯Ό λ‹¬μ„±ν•˜λŠ”λ° μœ λ¦¬ν•˜λ‹€. λ”°λΌμ„œ λ‹¨μˆœν•˜κ²Œ μƒκ°ν•˜λ©΄ 3κ°œμ”© λ¬Άμ–΄μ„œ μ œκ±°ν•œ λ’€ λ‚˜λ¨Έμ§€ 숫자λ₯Ό 2κ°œμ”© μ œκ±°ν•˜λ©΄ λœλ‹€.
    • ν•˜μ§€λ§Œ 3κ°œμ”© λ¬Άμ–΄μ„œ μ œκ±°ν–ˆμ„ λ•Œ 2κ°œκ°€ 남지 μ•ŠλŠ” κ²½μš°λŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό 될까?
      • μΆœν˜„λΉˆλ„ % 3 == 2: λ‚˜λ¨Έμ§€κ°€ 2μ΄λ―€λ‘œ μž‘μ—…μ˜ 숫자λ₯Ό ν•˜λ‚˜ 더해주면 λœλ‹€.
      • μΆœν˜„λΉˆλ„ % 3 == 1: λ‚˜λ¨Έμ§€κ°€ 1μ΄λ―€λ‘œ 기쑴에 3κ°œμ”© λ¬Άμ–΄μ„œ ν•œ μž‘μ—… ν•˜λ‚˜λ₯Ό μ·¨μ†Œν•œλ‹€. 그러면 남은 μˆ«μžκ°€ 4μ΄λ―€λ‘œ 2κ°œμ”© λ¬Άμ–΄μ„œ 2번 μ œκ±°ν•˜λ©΄ λœλ‹€. ν•˜μ§€λ§Œ κ²°κ΅­ 따져보면 μž‘μ—…μ˜ 숫자λ₯Ό ν•˜λ‚˜ λ”ν•΄μ£ΌλŠ” 것과 κ°™λ‹€.
    • 결둠적으둜 μΆœν˜„λΉˆλ„ % 3 β‰  0 이라면 μž‘μ—… 숫자λ₯Ό ν•˜λ‚˜ 늘렀주면 λœλ‹€.
class Solution { int countToOps(int count) { if (count == 1) return -1; int ops = count / 3; if (count % 3 != 0) ++ops; return ops; } public int minOperations(int[] nums) { int result = 0; int prev = 0; int count = 0; Arrays.sort(nums); for (int num : nums) { if (prev != num) { int ops = countToOps(count); if (ops == -1) return -1; result += ops; count = 0; } prev = num; ++count; } if (count > 0) { int ops = countToOps(count); if (ops == -1) return -1; result += ops; } return result; } }