Skip to content

[Leetcode] 31. Next Permutation โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

์ˆœ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ดํ–ˆ์„๋•Œ ์ฃผ์–ด์ง„ nums์˜ ๋‹ค์Œ๋ฒˆ์— ๋‚˜์˜ฌ ์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

Solution โ€‹

solution

๋‹ค์Œ์œผ๋กœ ํฐ ์ˆœ์—ด์„ ๊ตฌํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์—์„œ ์ˆซ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ทธ ๋’ค์˜ ์ˆซ์ž๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์žˆ๋‹ค.

  1. ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆซ์ž๋ฅผ ์ฐพ๋Š”๋‹ค. ์ด์œ ๋Š” ์ˆœ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ  ์ˆœ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  2. left ์ธ๋ฑ์Šค์˜ ์œ„์น˜๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด, left์˜ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด์˜ ๊ฐ’์—์„œ ๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ์ฐพ์•„ swapํ•œ๋‹ค.
  3. ๋งˆ์ง€๋ง‰์œผ๋กœ left์˜ ์˜ค๋ฅธ์ชฝ์˜ ๊ฐ’์„๋“ค reverseํ•ด์ฃผ๋ฉด๋œ๋‹ค.

std::next_permutation ๋‚ด๋ถ€๊ตฌํ˜„ โ€‹

  1. a[k] < a[k+1]์ธ k์ค‘ max์ธ k๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. a[k]๋ณด๋‹ค ํฐ ๊ฐ’๋“ค ์ค‘ m์ด ๊ฐ€์žฅ ํฐ m์„ ์ฐพ๋Š”๋‹ค.
  3. a[k]์™€ a[m]์„ swap ํ•œ๋‹ค.
  4. a[k+1]๋ถ€ํ„ฐ a[n:์ „์ฒด ์‚ฌ์ด์ฆˆ]๊นŒ์ง€ ๋ฐฐ์—ด์„ reverseํ•œ๋‹ค.

JS Code โ€‹

js
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var nextPermutation = function(nums) {
    const swap = (arr, a, b) => [ arr[a], arr[b] ] = [ arr[b], arr[a] ]
    
    let i = nums.length -2
    while(0 <= i && nums[i] >= nums[i+1]) i--
    
    if (0 <= i) {
        let j = nums.length-1
        while(nums[i] >= nums[j]) j--
        swap(nums, i, j)
    }
    nums.push(...nums.splice(i+1).reverse())
};

์ฐธ๊ณ