본문 바로가기
코딩테스트 및 알고리즘

DFS 부분 집합 구하기

by 영카이브 2024. 2. 21.

문제 . 자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 구하시오. (공집합 제외)

 

입력 예시

3

 

답 : 

1 2 3 
1 2
1 3
1
2 3
2
3

 

 

나의 답변

public class Main {	
	static int n; 
	static int[] ch; 
	public void DFS(int L) {
		if(L==n+1) {
			// 모든 원소를 선택한 경우
			String tmp=""; 
			for(int i=1; i<=n; i++) {
				if(ch[i]==1) tmp+=(i+ " ");
			}
			// 공집합 제외
			if(tmp.length()>0) System.out.println(tmp);
		}else {
			// 현재 위치의 원소를 선택한 경우
			ch[L]=1; 
			// 다음 위치로 이동하여 재귀적으로 탐색
			DFS(L+1); 
			// 현재 위치의 원소를 선택하지 않은 경우
			ch[L]=0; 
			// 다음 위치로 이동하여 재귀적으로 탐색
			DFS(L+1); 
		}
	}
	// 이진 트리 생성, DFS 수행
	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		// 선택한 원소를 표시하는 배열 초기화
		ch = new int[n+1]; 
		T.DFS(1);
	}
}

 

 

 

* D(4)는 종료지점이다. 

 

과정

public class Main {	
	static int n; 
	static int[] ch; 
	public void DFS(int L) {
		if(L==n+1) {
			// 모든 원소를 선택한 경우
			String tmp=""; 
			for(int i=1; i<=n; i++) {
				if(ch[i]==1) tmp+=(i+ " ");
			}
			// 공집합 제외
			if(tmp.length()>0) System.out.println(tmp);
		}else {
			// 현재 위치의 원소를 선택한 경우
			ch[L]=1; 
			// 다음 위치로 이동하여 재귀적으로 탐색
			System.out.println("L  : " + L + " : " + 1);
			DFS(L+1); 
			System.out.println("L : " + L + " : 1에서 돌아옴");
			// 현재 위치의 원소를 선택하지 않은 경우
			ch[L]=0; 
			System.out.println("L : " + L + " : " + 0);
			// 다음 위치로 이동하여 재귀적으로 탐색
			DFS(L+1); 
			System.out.println("L : " + L + " : 0에서 돌아옴");
		}
	}
	// 이진 트리 생성, DFS 수행
	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		// 자연수 N을 입력받음
		n = sc.nextInt();
		// 선택한 원소를 표시하는 배열 초기화
		ch = new int[n+1]; 
		T.DFS(1);
	}
}
3

L : 1 : 1

L : 2 : 1

L : 3 : 1

1 2 3

L : 3 : 1에서 돌아옴

L : 3 : 0

1 2

L : 3 : 0에서 돌아옴

L : 2 : 1에서 돌아옴

L : 2 : 0

L : 3 : 1

1 3

L : 3 : 1에서 돌아옴

L : 3 : 0

1

L : 3 : 0에서 돌아옴

L : 2 : 0에서 돌아옴

L : 1 : 1에서 돌아옴

L : 1 : 0

L : 2 : 1

L : 3 : 1

2 3

L : 3 : 1에서 돌아옴

L : 3 : 0

2

L : 3 : 0에서 돌아옴

L : 2 : 1에서 돌아옴

L : 2 : 0

L : 3 : 1

3

L : 3 : 1에서 돌아옴

L : 3 : 0

L : 3 : 0에서 돌아옴

L : 2 : 0에서 돌아옴

L : 1 : 0에서 돌아옴

 

 

 

 

 

 

 

 

 

 

참고 자료 출처 : https://www.inflearn.com/course/lecture?courseSlug=%EC%9E%90%EB%B0%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%BD%94%ED%85%8C%EB%8C%80%EB%B9%84&unitId=72773&tab=curriculum

'코딩테스트 및 알고리즘' 카테고리의 다른 글

BFS 응용  (0) 2024.02.24
BFS(큐 사용)  (0) 2024.02.23
DFS  (0) 2024.02.20
재귀함수  (0) 2024.02.18
결정 알고리즘 2  (0) 2024.02.18