๐Ÿš€ Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์›๋ฆฌ์™€ ํ™œ์šฉ ๋ฐฉ๋ฒ•

๊น€์ƒ์šฑยท2024๋…„ 8์›” 19์ผ
post-thumbnail

์ด ๊ธ€์—์„œ๋Š” Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ์™€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์‚ฌ์ „์ˆœ์œผ๋กœ ๋‹ค์Œ ์ˆœ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.


์›๋ฆฌ & ๋ฐฉ๋ฒ• ๐ŸŒŸ

1. ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๊นจ์ง€๋Š” ์ˆœ๊ฐ„์„ ์ฐพ์•„ pivot์œผ๋กœ ์„ค์ •

  • ๋ฐฐ์—ด์˜ ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๊นจ์ง€๋Š” ์œ„์น˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด ์œ„์น˜๋ฅผ pivot์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ๋ฐฐ์—ด์—์„œ ๋” ํฐ ์ˆœ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์œ„์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. pivot ๋’ค์˜ ์ˆซ์ž๋“ค์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋ฏ€๋กœ ์ด๋ฏธ ๊ฐ€์žฅ ํฐ ์ˆœ์—ด ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, pivot์„ ๋ฐ”๊พธ์–ด์•ผ ๋” ํฐ ์ˆœ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. pivot๋ณด๋‹ค ํฐ ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฐพ์•„ successor๋กœ ์„ค์ •

  • pivot์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ์˜ค๋ฅธ์ชฝ์—์„œ pivot๋ณด๋‹ค ํฐ ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด ์ˆ˜๋ฅผ successor๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, pivot ๋’ค์— ์žˆ๋Š” ์ˆซ์ž๋“ค์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋’ค์—์„œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ๊ฐ€์žฅ ์ž‘์€ successor๋ฅผ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ฐพ์€ successor์™€ pivot์„ ๊ตํ™˜ํ•˜์—ฌ ์‚ฌ์ „์ˆœ์œผ๋กœ ๋” ํฐ ์ˆœ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. pivot๊ณผ successor๋ฅผ ๊ตํ™˜

  • pivot๊ณผ successor๋ฅผ ๊ตํ™˜ํ•˜์—ฌ ์ˆœ์—ด์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

4. pivot ๋’ค์˜ ์ˆซ์ž๋“ค์„ ๋’ค์ง‘๊ธฐ

  • pivot ๋’ค์— ์žˆ๋Š” ์ˆซ์ž๋“ค์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๋’ค์ง‘์–ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€์žฅ ์ž‘์€ ์ˆœ์—ด์ด ๋˜์–ด, ์ „์ฒด ๋ฐฐ์—ด์€ ๋‹ค์Œ ์ˆœ์—ด์ด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ด์œ  ๐Ÿ’ก

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰

  • In-place ๋ฐฉ์‹์œผ๋กœ, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜์—ฌ ๋‹ค์Œ ์ˆœ์—ด์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ํšจ์œจ์„ฑ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์œผ๋กœ, ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•œ ์ˆœ์—ด ์ƒ์„ฑ๊ณผ ๋น„๊ตํ•˜์—ฌ ์Šคํƒ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋”์šฑ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ โœ๏ธ

์•„๋ž˜๋Š” Java๋กœ ๊ตฌํ˜„๋œ Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค:

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        // Example usage
    }

    public void nextPermutation(int[] arr) {
        int n = arr.length;
        int i = n - 2;
        
        while (i >= 0 && arr[i] >= arr[i + 1]) i--;
        
        if (i >= 0) {
            int j = n - 1;
            while (j >= 0 && arr[j] <= arr[i]) j--;
            swap(arr, i, j);
        }

        reverse(arr, i + 1, n - 1);
    }

    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    public static void reverse(int[] arr, int start, int end) {
        while (start < end) {
            swap(arr, start, end);
            start++;
            end--;
        }
    }
}

Next Permutation์„ ์ด์šฉํ•œ ์กฐํ•ฉ ์ƒ์„ฑ ๐ŸŽฒ

Next Permutation์€ ์‚ฌ์ „์ˆœ์œผ๋กœ ๋‹ค์Œ ์ˆœ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์—ด์„ ํ†ตํ•ด ๋ชจ๋“  ์กฐํ•ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 00011์ด๋ผ๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ํ†ตํ•ด 5๊ฐœ์˜ ์ˆ˜์—์„œ 2๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ Next Permutation์„ ์ด์šฉํ•ด ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด ๊ธ€์—์„œ๋Š” Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ์™€ ๊ทธ ์‚ฌ์šฉ ์ด์œ , ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์ฝ”๋“œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ํšจ์œจ์ ์ธ ์ˆœ์—ด ๋ฐ ์กฐํ•ฉ ์ƒ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๐Ÿš€

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