1658. Minimum Operations to Reduce X to Zero

  • Hint๋ฅผ ๋ณด๊ณ  ํ’€์—ˆ๋˜ ๋ฌธ์ œ.

ํ’€์ด 1

  • Array์˜ prefix + suffix๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ๋ฐ˜์ „์‹œ์ผœ์„œ ํ’€์–ด์•ผ ํ•œ๋‹ค.
  • sub array์˜ element ํ•ฉ subSum ์ด ์ „์ฒด element์˜ ํ•ฉ sum ์—์„œ x๋ฅผ ๋บ€ ๊ฐ’๊ณผ ๊ฐ™๊ฒŒ ๋งŒ๋“œ๋Š” sub array๋“ค์„ ์ฐพ๋Š”๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ๊ธด sub array๋ฅผ ์ฐพ๋Š”๋‹ค. ์ „์ฒด array ๊ธธ์ด์—์„œ ํ•ด๋‹น sub array์˜ ๊ธธ์ด๋ฅผ ๋นผ๋ฉด ๊ฒฐ๊ตญ prefix + suffix์˜ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค.
class Solution { public: int minOperations(vector<int>& nums, int x) { int N = nums.size(); int sum = accumulate(nums.begin(), nums.end(), 0); int start = 0, end = 0, subSum = 0, result = -1; while (start < N) { if (subSum > sum - x) { // remove start element from sub array subSum -= nums[start]; ++start; } else if (subSum < sum - x) { if (end == N) break; // add end element to sub array subSum += nums[end]; ++end; } else { // get maximum length of sub array if (end - start > result) { result = end - start; } // remove start element from sub array for next iteration subSum -= nums[start]; ++start; } } // min ops = N - max sub arr length return result != -1? N - result : -1; } };

ํ’€์ด 2

  • ์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋ ค์šด ์ด์œ ๋Š” array์—์„œ prefix + suffix์˜ ์กฐํ•ฉ์„ ์ฐพ์•„๋‚ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋งŒ์•ฝ ๋™์ผํ•œ array 2๊ฐœ๋ฅผ ์ด์–ด๋ถ™์ธ๋‹ค๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ ๊ธธ์ด์˜ sub array๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋งŒ sub array๋Š” array 2๊ฐœ๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฒฝ๊ณ„์„ ์— ๊ฑธ์ณ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๊ฒฝ๊ณ„์„ ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ๋œ๋‹ค. start <= N && end >= N - 1
  • ๋˜ํ•œ sub array์˜ ๊ธธ์ด๊ฐ€ array์˜ ๋ณธ๋ž˜ ๊ธธ์ด N ๋ณด๋‹ค ์ปค์„œ๋„ ์•ˆ๋œ๋‹ค.
class Solution { public: int minOperations(vector<int>& nums, int x) { int N = nums.size(); int tN = N * 2; int start = 0, end = 0, sum = 0, result = tN; while (start < tN) { if (sum > x) { sum -= nums[start % N]; ++start; } else if (sum < x) { if (end == tN) break; sum += nums[end % N]; ++end; } else { if (start <= N && end >= N - 1) { result = min(result, end - start); } sum -= nums[start % N]; ++start; } } return result <= N? result : -1; } };