๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/์ด๋ก 

Next Permutation์„ ์ด์šฉํ•œ ์ˆœ์—ด

by Edlin 2022. 5. 17.
  • ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ ๋’ค, ์‚ฌ์ „ ์ˆœ์œผ๋กœ ๋‹ค์Œ ์ˆœ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

์ ˆ์ฐจ

  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;
	}
}

๋Œ“๊ธ€