Solution

Memo

  • ์ˆœ์—ด ๊ตฌํ˜„ ๋ฌธ์ œ
  • cpp ํ’€์ด๋Š” next_permutation์„ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ–ˆ๋‹ค.
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    // ๋ฌธ์ œ ํ•ด๊ฒฐ ์ฝ”๋“œ ์ž‘์„ฑ
    int n;
    cin >> n;

    vector<int> arr;
    for (int i = 1; i < n + 1; i++) {
        arr.push_back(i);
    }

    do {
        for (int i: arr) {
            cout << i << ' ';
        }

        cout << '\n';
    } while (next_permutation(arr.begin(), arr.end()));   
    return 0;
}
  • ๋ฌธ์ œ๋Š” ์ฝ”ํ‹€๋ฆฐ ๊ตฌํ˜„ํ•˜๋‹ค๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
fun permute(list: MutableList<Int>, start: Int, end: Int) {
    // ๊ธฐ์ € ์กฐ๊ฑด: ๋ชจ๋“  ์œ„์น˜๊ฐ€ ๊ฒฐ์ •๋˜์—ˆ์„ ๋•Œ
    // ํ˜„์žฌ ์ˆœ์—ด์„ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ
    if (start == end) {
        println(list.joinToString(" "))
        return
    }

    // ํ˜„์žฌ ์œ„์น˜(start)์— ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์›์†Œ ๋ฐฐ์น˜ํ•ด๋ณด๊ธฐ
    for (i in start..end) {
        // start ์œ„์น˜์™€ i ์œ„์น˜์˜ ์›์†Œ ๊ตํ™˜
        // ์˜ˆ: list=[1,2,4,3], start=0, i=0 โ†’ ๊ตํ™˜ ํ›„ [1,2,4,3] (๋ณ€ํ™” ์—†์Œ)
        list[start] = list[i].also { list[i] = list[start] }

        // ๋‹ค์Œ ์œ„์น˜(start+1)๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ์ˆœ์—ด ์ƒ์„ฑ
        // ์˜ˆ: permute([1,2,4,3], 1, 3) ํ˜ธ์ถœ
        permute(list, start + 1, end)

        // ๋ฐฑํŠธ๋ž˜ํ‚น: ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณต์›
        // ์˜ˆ: ๋‹ค์‹œ list=[1,2,4,3]๋กœ ๋ณต์›
        list[start] = list[i].also { list[i] = list[start] }
    }
  • ์š”๊ฑฐ ํ‹€๋ ค์„œ ์ฐพ์•„๋ดค๋Š”๋ฐ, ์‚ฌ์ „์‹ ์ •๋ ฌ์ด ํ•„์š”ํ–ˆ๋‹ค. (์œ„ ๋ฐฉ์‹์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ)

์ˆœ์„œ๋„

  • ๊ตํ™˜: [1,2,4,3] (1๊ณผ 1 ๊ตํ™˜, ๋ณ€ํ™” ์—†์Œ)

  • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,2,4,3], 1, 3)

    • start=1, i=1
      • ๊ตํ™˜: [1,2,4,3] (2์™€ 2 ๊ตํ™˜, ๋ณ€ํ™” ์—†์Œ)
      • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,2,4,3], 2, 3)
        • start=2, i=2
          • ๊ตํ™˜: [1,2,4,3] (4์™€ 4 ๊ตํ™˜, ๋ณ€ํ™” ์—†์Œ)
          • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,2,4,3], 3, 3)
            • start=3, i=3: ์ถœ๋ ฅ “1 2 4 3”
          • ๋ณต์›: [1,2,4,3]
        • start=2, i=3
          • ๊ตํ™˜: [1,2,3,4] (4์™€ 3 ๊ตํ™˜)
          • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,2,3,4], 3, 3)
            • start=3, i=3: ์ถœ๋ ฅ “1 2 3 4”
          • ๋ณต์›: [1,2,4,3]
      • ๋ณต์›: [1,2,4,3]
    • start=1, i=2
      • ๊ตํ™˜: [1,4,2,3] (2์™€ 4 ๊ตํ™˜)
      • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,4,2,3], 2, 3)
        • start=2, i=2
          • ๊ตํ™˜: [1,4,2,3] (2์™€ 2 ๊ตํ™˜, ๋ณ€ํ™” ์—†์Œ)
          • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,4,2,3], 3, 3)
            • start=3, i=3: ์ถœ๋ ฅ “1 4 2 3”
          • ๋ณต์›: [1,4,2,3]
        • start=2, i=3
          • ๊ตํ™˜: [1,4,3,2] (2์™€ 3 ๊ตํ™˜)
          • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,4,3,2], 3, 3)
            • start=3, i=3: ์ถœ๋ ฅ “1 4 3 2”
          • ๋ณต์›: [1,4,2,3]
      • ๋ณต์›: [1,2,4,3]
    • start=1, i=3
      • ๊ตํ™˜: [1,3,4,2] (2์™€ 3 ๊ตํ™˜)
      • ์žฌ๊ท€ ํ˜ธ์ถœ:ย permute([1,3,4,2], 2, 3)
        • (์ดํ•˜ ์œ ์‚ฌํ•œ ๊ณผ์ • ๋ฐ˜๋ณต…)
  • ๋ฐ˜๋ฉด cpp next_permutation์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค. (์ฐธ๊ณ ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ next_permutation์„ ํ˜ธ์ถœํ•ด์•ผ ๋ชจ๋“  ์ˆœ์—ด์„ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ž์—ฌ์žˆ์œผ๋ฉด ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ๋‹ค์Œ ์‚ฌ์ „ ์ˆœ์„œ์˜ ์ˆœ์—ด์„ ๋‚ด๋ณด๋‚ธ๋‹ค)

  • ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ (์‚ฌ์‹ค ์ฐธ๊ณ ๋ฅผ ์ข€ ํ–ˆ๋‹ค)

fun getNextPermutation(arr: IntArray): Boolean {
    // 1๋‹จ๊ณ„: ๋’ค์—์„œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๊นจ์ง€๋Š” ์œ„์น˜ ์ฐพ๊ธฐ
    var i = arr.size - 1
    // ์˜ˆ์‹œ: arr = [1,2,4,3]
    // i=3์ผ ๋•Œ, arr[2]=4, arr[3]=3์ด๋ฏ€๋กœ arr[2] > arr[3], i--
    // i=2์ผ ๋•Œ, arr[1]=2, arr[2]=4์ด๋ฏ€๋กœ arr[1] < arr[2], ๋ฐ˜๋ณต ์ข…๋ฃŒ
    // ์ตœ์ข… i=2
    while (i > 0 && arr[i - 1] >= arr[i]) i--

    // ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์™„์ „ํžˆ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฉด ๋งˆ์ง€๋ง‰ ์ˆœ์—ด
    // ์˜ˆ์‹œ: arr = [3,2,1]์ด๋ฉด i=0์ด ๋˜์–ด false ๋ฐ˜ํ™˜
    if (i <= 0) return false

    // 2๋‹จ๊ณ„: arr[i-1]๋ณด๋‹ค ํฐ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฐ’ ์ฐพ๊ธฐ
    var j = arr.size - 1
    // ์˜ˆ์‹œ: arr = [1,2,4,3], i=2, i-1=1, arr[i-1]=2
    // j=3์ผ ๋•Œ, arr[3]=3 > arr[1]=2, ๋ฐ˜๋ณต ์ข…๋ฃŒ
    // ์ตœ์ข… j=3
    while (arr[j] <= arr[i - 1]) j--

    // 3๋‹จ๊ณ„: arr[i-1]๊ณผ arr[j] ๊ตํ™˜
    // ์˜ˆ์‹œ: arr = [1,2,4,3], i-1=1, j=3
    // arr[1]=2์™€ arr[3]=3 ๊ตํ™˜
    // ๊ฒฐ๊ณผ: arr = [1,3,4,2]
    arr[i - 1] = arr[j].also { arr[j] = arr[i - 1] }

    // 4๋‹จ๊ณ„: i๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋’ค์ง‘๊ธฐ (์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ)
    // ์˜ˆ์‹œ: arr = [1,3,4,2], i=2
    // i=2๋ถ€ํ„ฐ ๋๊นŒ์ง€ [4,2]๋ฅผ ๋’ค์ง‘์–ด [2,4]๋กœ ๋งŒ๋“ฆ
    // ๊ฒฐ๊ณผ: arr = [1,3,2,4]
    j = arr.size - 1
    while (i < j) {
        arr[i] = arr[j].also { arr[j] = arr[i] }
        i++
        j--
    }

    return true
}
  1. ๋’ค์—์„œ๋ถ€ํ„ฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ 0๋ฒˆ ์›์†Œ๊นŒ์ง€ ์™€์ง€๋ฉด ๋งˆ์ง€๋ง‰์ˆœ์—ด
  2. ๋ฐ˜๋Œ€๋กœ ๋’ค์—์„œ๋ถ€ํ„ฐ ์˜ค๋ฆ„์ฐจ์ˆœ ์ฒดํฌ๊ฐ€ ๊นจ์ง€๋ฉด ๋‹ค์Œ์ˆœ์—ด์ด ์žˆ๋Š”๊ฒƒ(๋” ํฐ ์ˆ˜์—ด)
  3. 2๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” ์›์†Œ๋ฅผ ์ฐพ๊ณ (i) ๊ทธ ์•ž์— ์˜ฌ ์ˆซ์ž(i -1)์„ ์ฐพ๋Š”๋‹ค.
  4. ํ•ด๋‹น ์ˆซ์ž ์—ญ์‹œ ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฐพ์œผ๋ฉฐ (j) ์ฐพ์œผ๋ฉด (i -1)๊ณผ ์Šค์™‘
  5. i ์ดํ›„์˜ ์ˆซ์ž๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. (๋” ํฐ ์ˆซ์ž ์ค‘ ๊ฐ€์žฅ ์ž‘๋„๋ก)