Algorithm/이둠

Next Permutation을 μ΄μš©ν•œ μˆœμ—΄

Edlin 2022. 5. 17. 21:54
  • 배열을 μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•œ λ’€, 사전 순으둜 λ‹€μŒ μˆœμ—΄μ„ μƒμ„±ν•˜λŠ” 방법

절차

  1. 배열을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
  2. λ‹€μŒμ΄ κ³Όμ •μ˜ λ°˜λ³΅ν•˜μ—¬ μˆœμ—΄ 생성 (κ°€μž₯ 큰 λ‚΄λ¦Όμ°¨μˆœ μˆœμ—΄μ„ λ§Œλ“€ λ•ŒκΉŒμ§€ 반볡)
    • λ’€μͺ½λΆ€ν„° νƒμƒ‰ν•˜μ—¬ κ΅ν™˜μœ„μΉ˜(κΌ­λŒ€κΈ° λ°”λ‘œ 직전) μ°ΎκΈ° (κΌ­λŒ€κΈ° - κ°€μž₯ 큰 수)
    • λ’€μͺ½λΆ€ν„° νƒμƒ‰ν•˜μ—¬ κ΅ν™˜μœ„μΉ˜μ™€(κΌ­λŒ€κΈ° λ°”λ‘œ 직전) κ΅ν™˜ν•  큰 κ°’ μœ„μΉ˜ μ°ΎκΈ° (κ΅ν™˜μœ„μΉ˜λ³΄λ‹€ 큰 수 쀑 κ°€μž₯ κ°€κΉŒμš΄ 수)
    • 두 μœ„μΉ˜ κ°’ κ΅ν™˜
    • κΌ­λŒ€κΈ°λΆ€ν„° 맨 λ’€κΉŒμ§€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

ex. 1 2 3 -> 3 2 1 κΉŒμ§€ λ§Œλ“œλŠ” κ³Όμ •

1 2 3 -> 3 2 1 κΉŒμ§€ λ§Œλ“œλŠ” κ³Όμ •

import java.util.Arrays;

public class NextPermutation {
	static int R, N, nums[], set[];

	public static void main(String[] args) {

//			nPn
		N = 4;
		nums = new int[] { 1, 2, 4, 3, 5};
		set = new int[R]; // 쑰합을 λ§Œλ“€μ—ˆμ„ λ•Œμ˜ μ§‘ν•©

		// 1. μ˜€λ¦„μ°¨μˆœ μ •λ ¬
		Arrays.sort(nums);
		
		do {
			System.out.println(Arrays.toString(nums));
			
		}while(nextPermutation());
		
	}

	// 2. κΌ­λŒ€κΈ°λ₯Ό μ°Ύμ•„μ„œ μˆœμ—΄ λ§Œλ“€κΈ°
	private static boolean nextPermutation() {

		// 1) κΌ­λŒ€κΈ° μ°ΎκΈ°
		int i = N - 1;
		while (i > 0 && nums[i - 1] >= nums[i])
			--i;

		// i==0이면, λ§Œλ“€ 수 μžˆλŠ” ν˜•νƒœμ˜ μˆœμ—΄μ΄ 더이상 μ—†λ‹€λŠ” 뜻 (λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μˆœμ—΄μ„ λ‹€ λ§Œλ“€μ—ˆλ‹€)
		if (i == 0)
			return false;

		// 2) κ΅ν™˜ μœ„μΉ˜μ— κ΅ν™˜ν•  κ°’ μ°ΎκΈ°
		int j = N - 1;
		while (nums[i - 1] >= nums[j])
			--j;

		// 3) κ΅ν™˜ν•  μœ„μΉ˜μ™€ κ΅ν™˜ν•  μœ„μΉ˜λ³΄λ‹€ 큰 κ°’ λ°”κΎΈκΈ°
		swap(i - 1, j);

		// 4) κΌ­λŒ€κΈ°λΆ€ν„° 맨 λ’€κΉŒμ§€ μ˜€λ¦„ 차순 μ •λ ¬
		int k = N - 1;
		while (i < k) {
			swap(i++, k--);
		}

		return true;
	}

	private static void swap(int i, int j) {
		int temp = nums[i];
		nums[i] = nums[j];
		nums[j] = temp;
	}
}