2009. Minimum Number of Operations to Make Array Continuous

  • 해닡을 봐도 이해가 μ–΄λ €μ› λ˜ 문제.
    • arrayλ₯Ό μ •λ ¬ν•  ν•„μš”κ°€ μžˆλ‹€λŠ” κ²ƒκΉŒμ§€λŠ” μ•Œμ•˜λŠ”λ° μ€‘λ³΅λœ μˆ«μžμ— λŒ€ν•œ 처리, λΆˆμ—°μ†μΈ μˆ«μžμ— λŒ€ν•œ 처리λ₯Ό μ–΄λ–€μ‹μœΌλ‘œ 해야될지 μƒκ°ν•˜κΈ° μ–΄λ €μ› λ‹€.
    • 일뢀 test case에 λŒ€ν•΄μ„œλŠ” μ •λ ¬λœ array의 μ΄μ›ƒν•œ 숫자끼리 λΉ„κ΅ν•˜μ—¬ μ—°μ†λ˜μ§€ μ•Šμ€ 경우λ₯Ό κ°€λ €λ‚΄λ©΄ ν’€λ¦¬κΈ°λŠ” ν•˜μ§€λ§Œ μ€‘λ³΅λœ μˆ«μžκ°€ μ‘΄μž¬ν•˜λ©΄ μ²˜λ¦¬κ°€ μ–΄λ €μš΄ 뢀뢄이 μžˆλ‹€.
  • λ¨Όμ € arrayλ₯Ό μ •λ ¬ν•œ λ’€ uniqueν•œ element만 남겨둔닀.
  • 그런 λ’€ 각 uniqueν•œ element 에 λŒ€ν•˜μ—¬ λ‹€μŒκ³Ό 같이 κ²°κ³Όλ₯Ό κ³„μ‚°ν•œλ‹€ .
    • λ₯Ό array의 μ΅œμ†Œκ°’μœΌλ‘œ ν•œλ‹€λ©΄ array에 λ“€μ–΄κ°ˆ 수 μžˆλŠ” μ΅œλŒ€ 값은 이 λœλ‹€.
    • , λ₯Ό κΈ°μ€€μœΌλ‘œ arrayλ₯Ό ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.
    • μ•žμ— μžˆλŠ” μˆ«μžλ“€ () 그리고 뒀에 μžˆλŠ” μˆ«μžλ“€ () 은 , 사이에 μžˆλŠ” μˆ«μžλ“€λ‘œ λŒ€μ²΄λ˜μ–΄μ•Όλ§Œ 쑰건을 λ§Œμ‘±ν•  수 μžˆλ‹€. λ”°λΌμ„œ 이 μˆ«μžλ“€μ˜ κ°œμˆ˜κ°€ operation의 μˆ˜κ°€ λœλ‹€.
      • μ•žμ— μžˆλŠ” μˆ«μžλ“€μ˜ κ°œμˆ˜λŠ” β†’ it - nums.begin()
      • 뒀에 μžˆλŠ” μˆ«μžλ“€μ˜ κ°œμˆ˜λŠ” β†’ N - (upper - nums.begin())
      • 참고둜 upper bound 이기 λ•Œλ¬Έμ— array에 κ°€ 없어도 상관 μ—†λ‹€.
    • 결과적으둜 operation의 μˆ˜λŠ” ops = N - (upper - nums.begin()) + it - nums.begin() = N - (upper - it) κ°€ λœλ‹€.
    • 이 κ°’ 쀑에 μ΅œμ†Œκ°’μ„ 찾으면 λœλ‹€.
class Solution { public: int minOperations(vector<int>& nums) { int N = nums.size(); sort(nums.begin(), nums.end()); auto numsEnd = unique(nums.begin(), nums.end()); int result = INT_MAX; for (auto it = nums.begin(); it != numsEnd; ++it) { int maxNum = *it + N - 1; auto upper = upper_bound(it, numsEnd, maxNum); int diff = upper - it; result = min(result, N - diff); } return result; } };