581. Shortest Unsorted Continuous Subarray

๋Š˜๋ณดยท2021๋…„ 10์›” 18์ผ
0

LeetCode

๋ชฉ๋ก ๋ณด๊ธฐ
46/69

๐Ÿ’ก ํ’€์ด

// // O(NlogN)
var findUnsortedSubarray = function (nums) {
  let sorted = [...nums].sort((a, b) => a - b);

  let start = 0;
  let end = 0;

  for (let i = 0; i < sorted.length; i++) {
    if (sorted[i] !== nums[i]) {
      start = i;
      break;
    }
  }

  for (let j = sorted.length - 1; j >= 0; j--) {
    if (sorted[j] !== nums[j]) {
      end = j;
      break;
    }
  }

  if (!start && !end) return 0;
  return end - start + 1;
};

// O(N)
const findUnsortedSubarray = nums => {
  let min = 100000;
  let max = -100000;

  for (let i = 1; i < nums.length; i++) {
    let prev = nums[i - 1];
    let cur = nums[i];

    if (cur < prev) min = Math.min(min, cur);
  }

  for (let j = nums.length - 1; j >= 0; j--) {
    let prev = nums[j + 1];
    let cur = nums[j];

    if (cur > prev) max = Math.max(max, cur);
  }

  if (max === 0 && min === 100000) return 0;

  let start = 0;
  let end = 0;

  for (let k = 0; k < nums.length; k++) {
    if (min < nums[k]) {
      start = k;
      break;
    }
  }

  for (let u = nums.length - 1; u >= 0; u--) {
    if (max > nums[u]) {
      end = u;
      break;
    }
  }

  if (!start && !end) return 0;

  let answer = end - start + 1;

  return answer;
};



// ๊บพ์ด๋Š” ์ง€์  ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ๊ณ  (์•ž์—์„œ๋ถ€ํ„ฐ loop์„ ๋Œ ๋•Œ)
// ๊บพ์ด๋Š” ์ง€์  ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค(๋’ค์—์„œ ๋ถ€ํ„ฐ loop์„ ๋Œ ๋•Œ)

// ์ดํ›„ ํ•ด๋‹น ๊บพ์ด๋Š” ์ง€์ ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‹น๊ฒจ์ค€๋‹ค. (์•ž์—์„œ๋ถ€ํ„ฐ loop์„ ๋Œ ๋•Œ)
// ์ดํ›„ ํ•ด๋‹น ๊บพ์ด๋Š” ์ง€์ ์„ ์™ผ์ชฝ์œผ๋กœ ๋‹น๊ฒจ์ค€๋‹ค. (๋’ค์—์„œ๋ถ€ํ„ฐ loop์„ ๋Œ ๋•Œ)

๐Ÿ“ ์ •๋ฆฌ

1. ๋จผ์ € ์ฒ˜์Œ ๋‚ด๊ฐ€ ํ‘ผ ๋ฐฉ๋ฒ•์ด๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„ O(NlogN)์œผ๋กœ ํ’€์—ˆ๋˜ ๋ฐฉ๋ฒ•์ด๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•ด์„œ nums ๋ฐฐ์—ด๊ณผ sorted ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜์ž.

  • ์›๋ณธ ๋ฐฐ์—ด nums์™€

  • nums๋ฅผ ์ •๋ ฌํ•œ ๋ฐฐ์—ด sorted๋ผ๋Š” ๋ฐฐ์—ด์„ ์ค€๋น„ํ•œ๋‹ค.

  • ์ดํ›„ ์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜๊ณ  (์ˆœ์„œ๋Œ€๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ) ์ฒ˜์Œ nums[i]์™€ sorted[i]๊ฐ€ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค. (ํ•ด๋‹น ์ธ๋ฑ์Šค = start)

  • ๋˜ํ•œ ๋’ค์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋น„๊ต๋ฅผ ํ•ด์„œ (์—ญ์ˆœ์œผ๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ) nums[j]์™€ sorted[j]๊ฐ€ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค. (ํ•ด๋‹น ์ธ๋ฑ์Šค = end)

  • ์ดํ›„ end - start + 1์„ ํ•˜๋ฉด ๊ทธ๊ฒŒ ์ตœ์†Œ ์ •๋ ฌ์„ ํ•  ์ˆ˜ ์žˆ๋Š” subArray์˜ ๊ธธ์ด๋‹ค.

2. ๋‘ ๋ฒˆ์งธ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)์˜ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐ˜๋ณต๋ฌธ 4๊ฐœ๋กœ 4 * N์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” O(N)์ด๋‹ค.

์œ„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์ž. ๊ทธ๋ž˜ํ”„๋ฅผ nums ๋ฐฐ์—ด์„ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

  • ๋งŒ์•ฝ 0๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ nums ๋ฐฐ์—ด์„ ์ˆœํšŒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ๊บพ์ด๋Š” ์ง€์ (๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ์ง€์ )์ด ๋ฐ”๋กœ ์ •๋ ฌ์„ ํ•ด์•ผ๋˜๋Š” ์ง€์ ์ด๋‹ค. ๊ทธ ๊บพ์ด๋Š” ์ง€์  ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ์ด๋ฒˆ์—” ๋์—์„œ๋ถ€ํ„ฐ 0๊นŒ์ง€ ์—ญ์ˆœ์œผ๋กœ nums ๋ฐฐ์—ด์„ ์ˆœํšŒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊บพ์ด๋Š” ์ง€์ (๊ทธ๋ž˜ํ”„๊ฐ€ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ์ง€์ )์ด ๋ฐ”๋กœ ์ •๋ ฌ์ด ๋งˆ๋ฌด๋ฆฌ ๋˜์–ด์•ผ ํ•˜๋Š” ์ง€์ ์ด๋‹ค. ๊ทธ ๊บพ์ด๋Š” ์ง€์  ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.

  • ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(์ดํ•˜ min)์„ ๊ฐ€์ง€๋Š” ์ธ๋ฑ์Šค๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ญ‰ ์˜ฎ๊ธด๋‹ค. ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€. ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋‚˜๋Š” ์ง€์ ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ •๋ ฌ์„ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋งŒ๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ธ๋ฑ์Šค 0, ์ฆ‰ ๊ฐ€์žฅ ์ฒซ๋ถ€๋ถ„์ด ์ •๋ ฌ์„ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

  • ๊ฐ€์žฅ ํฐ ๊ฐ’(์ดํ•˜ max)์„ ๊ฐ€์ง€๋Š” ์ธ๋ฑ์Šค๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ญ‰ ์˜ฎ๊ธด๋‹ค. ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋‚˜๋Š” ์ง€์ ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ •๋ ฌ์ด ๋งˆ๋ฌด๋ฆฌ๋˜์–ด์•ผ ํ•  ์ง€์ ์ด ๋  ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋งŒ๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ธ๋ฑ์Šค๊ฐ€ nums.length - 1, ์ฆ‰ ๊ฐ€์žฅ ๋๋ถ€๋ถ„์ด ์ •๋ ฌ์ด ๋งˆ๋ฌด๋ฆฌ ๋˜์–ด์•ผ ํ•˜๋Š” ์ง€์ ์ด ๋œ๋‹ค.

  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ์˜ฎ๊ธด ๋‘ ์ธ๋ฑ์Šค์˜ ์ฐจ + 1์„ ํ•ด์ฃผ๋ฉด subArray์˜ ์ตœ์†Œ ๊ธธ์ด๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

์ˆ˜์ •, ์ง€์ ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๋ฌธ์ œ ๋งํฌ

https://leetcode.com/problems/shortest-unsorted-continuous-subarray/

LeetCode GitHub

https://github.com/tTab1204/LeetCode

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด