Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

공부블로그

순열 알고리즘 본문

IT/알고리즘

순열 알고리즘

So1_b 2022. 7. 29. 16:19

공부한 사이트

 

 

3!은 3개의 의자에서

첫번째 의자에 앉을 수 있는 경우 3 

두번째 의자에 앉을 수 있는 경우 2 ( 이미 첫번째 의자에 앉았으므로 )

세번째 의자에 앉을 수 있는 경우 1 (나머지)

3! = 3*2*1이다.

 

<코드 설명> 

첫번째 올 원소를 지정 + 나머지 원소들의 순열을 구한다.

 

집합 S={ a, b, c ,d}의 순열을 상태공간트리로 나타냈을 때 제일 마지막 노드를 출력하는 것.

 

- 기저 케이스: k번째 자리까지 다 지정을 한 상황, data배열을 출력한다.

 

- k번째 자리에 원소를 지정한다. = swap(data, k, i); 

  여기에서 i는 지정될 원소의 인덱스, k는 몇번째 자리인지를 의미. 

  k ~ n-1인덱스의 원소가 다 들어갈 수 있기 때문에 for문을 사용한다. 

 

- k자리에 원소가 결정되었으면 다음 자리를 지정하기 위해 k+1를 매개변수로 재귀한다. printPerm(k+1)

 

- swap()으로 바뀐 순서를 원위치 시킨다. = swap(data, k, i)

* 주의: recursion 호출 전 후로 공용으로 사용하는 데이터는 순서가 변경되지 않고 유지되도록 해야한다. 

   왜? data의 인덱스를 기준으로 자리배정을 하는데 원소의 위치가 바뀌면, 인덱스가 변경되어도 똑같은 원소를 가리켜 k자리에 똑같은 원소가 여러번 올 수 있음

   따라서 반드시 바꾼 순서를 원상복귀 시켜야 함.

 

package repeat;
import java.util.Arrays;

public class permutation {
	char data[] = {'a','b','c','d'};
	int n=4;
	
	void printPerm(int k) {
		if(k==n) {
			System.out.println(Arrays.toString(data));
			return;
		}
		for(int i=k; i<n; i++) {
			swap(data, k, i);	//swap data[k] and data[i]
			printPerm(k+1);
			swap(data, k, i);	//recursion전후로 데이터의 순서를 유지하기 위함.
		}
	}
	
	void swap(char array[], int k, int i) {
		char tmp = array[k];
		array[k] = array[i];
		array[i] = tmp;
	}
	
	public static void main(String[] args) {
		permutation p = new permutation();
		p.printPerm(0);
	}

}

'IT > 알고리즘' 카테고리의 다른 글

[프로그래머스] 폰켓몬  (0) 2022.08.15
단순 삽입 정렬  (0) 2022.08.08
멱집합 알고리즘  (0) 2022.07.26
[프로그래머스] 행렬의 덧셈  (0) 2022.07.25
N Queen문제  (0) 2022.07.25
Comments