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

Next Permutation์„ ์ด์šฉํ•œ ์กฐํ•ฉ

by Edlin 2022. 5. 17.
  • flag๋ฅผ Next Permutation์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ ๊ฒƒ
  • nCr ์„ ๊ตฌํ•˜๊ณ ์ž ํ•  ๋•Œ, ํฌ๊ธฐ n์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ r ๊ฐœ์˜ ํฌ๊ธฐ๋งŒํผ 0 ์ด ์•„๋‹Œ ๊ฐ’ ์ดˆ๊ธฐํ™”

5C2 ์ด๋ฉด, 00011 ๋กœ ์ดˆ๊ธฐํ™”

  • Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ

00011์„ ์‚ฌ์šฉํ•˜์—ฌ NP๋ฅผ ๋Œ๋ฆฌ๊ณ  1์˜ ์œ„์น˜์— ์›์†Œ ๊ฐ’์ด ์„ ํƒ๋˜์–ด ์กฐํ•ฉ์„ ๋งŒ๋“ ๋‹ค.

  • Next Permutation ํ•œ ๋ฒˆ ์ด์šฉํ•  ๋•Œ๋งˆ๋‹ค ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด ์ง„๋‹ค. (0์ด ์•„๋‹Œ ๊ฐ’์˜ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค)
    => r๊ฐœ์˜ ํฌ๊ธฐ ๋งŒํผ, ์ฆ‰, 0์ด ์•„๋‹Œ ๊ฐ’์ด ์„ธํŒ…๋œ ๊ณณ์— ์›์†Œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์กฐํ•ฉ์„ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

import java.util.Arrays;

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

	public static void main(String[] args) {
//			nCr
		R = 3;
		N = 5;
		nums = new int[] { 1, 2, 3, 4, 5 };

		int[] set = new int[N];
		// 0๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ R๊ฐœ๋ฅผ ๋งจ ๋’ค๋ถ€ํ„ฐ ์ฑ„์šด๋‹ค.
		int cnt = 0;
		while (++cnt <= R)
			set[cnt] = 1;
		Arrays.sort(set); // ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ

		do {
			for(int i = 0; i < N; i++) {
				if(set[i] == 1) {
					System.out.print(nums[i]+" ");
				}
			}
			System.out.println();
			
		} while (nextPermutation(set));
	}

	// 2. ๊ผญ๋Œ€๊ธฐ๋ฅผ ์ฐพ์•„์„œ ์ˆœ์—ด ๋งŒ๋“ค๊ธฐ
	private static boolean nextPermutation(int[] set) {

		// 1) ๊ผญ๋Œ€๊ธฐ ์ฐพ๊ธฐ
		int i = N - 1;
		while (i > 0 && set[i - 1] >= set[i])
			--i;

		// i==0์ด๋ฉด, ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์˜ ์ˆœ์—ด์ด ๋”์ด์ƒ ์—†๋‹ค๋Š” ๋œป (๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆœ์—ด์„ ๋‹ค ๋งŒ๋“ค์—ˆ๋‹ค)
		if (i == 0)
			return false;

		// 2) ๊ตํ™˜ ์œ„์น˜์— ๊ตํ™˜ํ•  ๊ฐ’ ์ฐพ๊ธฐ
		int j = N - 1;
		while (set[i - 1] >= set[j])
			--j;

		// 3) ๊ตํ™˜ํ•  ์œ„์น˜์™€ ๊ตํ™˜ํ•  ์œ„์น˜๋ณด๋‹ค ํฐ ๊ฐ’ ๋ฐ”๊พธ๊ธฐ
		swap(set, i - 1, j);

		// 4) ๊ผญ๋Œ€๊ธฐ๋ถ€ํ„ฐ ๋งจ ๋’ค๊นŒ์ง€ ์˜ค๋ฆ„ ์ฐจ์ˆœ ์ •๋ ฌ
		int k = N - 1;
		while (i < k) {
			swap(set, i++, k--);
		}

		return true;
	}

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

๋Œ“๊ธ€