[Boj_10972] ๋‹ค์Œ ์ˆœ์—ด

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/10972

 

โ–ธ ๋ฌธ์ œ

1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์—ด์ด ์žˆ๋‹ค. ์ด๋•Œ, ์‚ฌ์ „์ˆœ์œผ๋กœ ๋‹ค์Œ์— ์˜ค๋Š” ์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์‚ฌ์ „ ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ์•ž์„œ๋Š” ์ˆœ์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์—ด์ด๊ณ , ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ์ˆœ์—ด์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์—ด์ด๋‹ค.

N = 3์ธ ๊ฒฝ์šฐ์— ์‚ฌ์ „์ˆœ์œผ๋กœ ์ˆœ์—ด์„ ๋‚˜์—ดํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 10,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— ์ˆœ์—ด์ด ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆœ์—ด์˜ ๋‹ค์Œ์— ์˜ค๋Š” ์ˆœ์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ์‚ฌ์ „์ˆœ์œผ๋กœ ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ์ˆœ์—ด์ธ ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅˆ  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ์‹ค๋ฒ„ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ˆ˜ํ•™, ์กฐํ•ฉ๋ก 
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๐Ÿ“๋‹ค์Œ ์ˆœ์—ด(Next Permutation)

๋‹ค์Œ ์ˆœ์—ด์ด๋ž€, ํ˜„์žฌ ์ˆœ์—ด๋ณด๋‹ค ์‚ฌ์ „์ˆœ์œผ๋กœ ๋ฐ”๋กœ ๋‹ค์Œ์— ์˜ค๋Š” ์ˆœ์—ด์„ ์˜๋ฏธํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์ˆœ์—ด์„ ๊ตฌํ•˜๊ณ  ์‹ถ์€ ์ˆœ์—ด์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•ด๋ณด์ž.

์ˆœ์—ด : 7 2 3 6 5 4 1

 

์ด ์ˆœ์—ด์— ๋Œ€ํ•ด ๋‹ค์Œ ์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 4๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

1๏ธโƒฃ A[i-1] < A[i]๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ i ์ฐพ๊ธฐ

๋’ค์—์„œ๋ถ€ํ„ฐ ์ˆœ์—ด์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ฒ˜์Œ์œผ๋กœ ๊ฐ์†Œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ์ง€์ (i-1)์„ ์ฐพ๋Š”๋‹ค.

์ฆ‰, A[i-1] < A[i]๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ i๋ฅผ ์ฐพ๋Š”๋‹ค.

์ด๋Š” ๋’ค์ชฝ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ ๊ตฌ๊ฐ„์ด ๋๋‚˜๋Š” ์ง€์ ์„ ์˜๋ฏธํ•œ๋‹ค.

7 2 3 6 5 4 1
      โ–ฒ
     i-1 = 2 (A[i-1] = 3), i = 3 (A[i] = 6)

 

2๏ธโƒฃ j ≥ i์ด๋ฉด์„œ A[j] > A[i-1]์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ j ์ฐพ๊ธฐ

i๋ถ€ํ„ฐ ์ˆœ์—ด์„ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฉฐ, A[j] > A[i-1]์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ j๋ฅผ ์ฐพ๋Š”๋‹ค.

์ด๋Š” i ≤ j ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ A[j] > A[i-1]์ธ ๊ฐ€์žฅ ํฐ j๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

7 2 3 6 5 4 1
          โ–ฒ
         j = 5 (A[j] = 4), A[i-1] = 3

 

3๏ธโƒฃ A[i-1]๊ณผ A[j]๋ฅผ swap

์ฐพ์€ ๋‘ ๊ฐ’์„ ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค.

Before swap: 7 2 3 6 5 4 1  
After swap : 7 2 4 6 5 3 1

 

4๏ธโƒฃ A[i]๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ (๋’ค์ง‘๊ธฐ)

A[i]๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์€ ์›๋ž˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—,
ํ•ด๋‹น ๊ตฌ๊ฐ„์„ ๋’ค์ง‘์–ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉด ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์—ด์ด ๋œ๋‹ค.

Before reverse: 7 2 4 6 5 3 1  
After reverse : 7 2 4 1 3 5 6

 

์ด๋ ‡๊ฒŒ 4๋‹จ๊ณ„ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ์ž…๋ ฅ๋œ ์ˆœ์—ด์˜ ๋‹ค์Œ ์ˆœ์—ด์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์ž…๋ ฅ๋œ ์ˆœ์—ด์ด ์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ˆœ์—ด์ด๋ผ๋ฉด, ๋” ์ด์ƒ ๋‹ค์Œ ์ˆœ์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์œ„ ํ’€์ด์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 13432KB
์‹œ๊ฐ„ : 96ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int[] arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine()); // 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜

        StringTokenizer st = new StringTokenizer(br.readLine());
        arr = new int[n]; // ์ˆœ์—ด
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        StringBuilder sb = new StringBuilder();
        if (nextPermutation()) {
            for (int a : arr) {
                sb.append(a).append(" ");
            }
        } else { // ์‚ฌ์ „์ˆœ์œผ๋กœ ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ์ˆœ์—ด
            sb.append(-1);
        }

        System.out.println(sb.toString());

        br.close();
    }

    private static boolean nextPermutation() {
        int i = arr.length-1;

        // A[i-1] < A[i]๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ i๋ฅผ ์ฐพ๊ธฐ
        while (i > 0 && arr[i-1] >= arr[i]) {
            i -= 1;
        }

        // i์˜ ์œ„์น˜๊ฐ€ 0์ด๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ (๋งˆ์ง€๋ง‰ ์ˆœ์—ด)
        if (i <= 0) return false;

        // j >= i์ด๋ฉด์„œ A[j] > A[i-1] ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ j๋ฅผ ์ฐพ๊ธฐ
        int j = arr.length-1;
        while (arr[i-1] >= arr[j]) {
            j -= 1;
        }

        // A[i-1]๊ณผ A[j]๋ฅผ swap
        int tmp = arr[j];
        arr[j] = arr[i-1];
        arr[i-1] = tmp;

        j = arr.length-1;
        // A[i]๋ถ€ํ„ฐ ์ˆœ์—ด ๋’ค์ง‘๊ธฐ
        while (i < j) {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i += 1;
            j -= 1;
        }

        return true;
    }
}

 

์ฒ˜์Œ์—” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์ž…๋ ฅ๊ฐ’๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ์ถœ๋ ฅํ•˜๋ฉด ๋˜๊ฒ ๋‹ค ์ƒ๊ฐํ–ˆ๋Š”๋ฐ,

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋‹ค์Œ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•  ๊ฒธ ํฌ์ŠคํŒ…ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์˜ค๋Š˜๋„ ์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ํ•˜๋‚˜ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค ! @,@