UL :)
UL의 개발 블로그
UL :)
전체 방문자
오늘
어제
  • 분류 전체보기 (220)
    • 일상 (1)
    • 회고록 (7)
    • ChatGPT 아카이빙 (0)
    • PS(Java) (114)
      • 백준 (37)
      • 인프런 강의 문제 (77)
    • Web (69)
      • Spring (18)
      • JPA (7)
      • JSP (9)
      • HTML5 (12)
      • CSS (19)
      • HTTP (0)
      • 보안 (2)
    • Language (5)
      • Java (3)
      • JS (1)
      • Python (1)
    • Git, GitHub (4)
    • Settings (18)
      • IntelliJ (7)
      • Eclipse (2)
      • VSCode (3)
      • Android Studio (1)
      • VMware (2)
      • Mac (0)
    • Etc (1)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • EntityManagerFactory
  • argumentresolver
  • BOJ
  • 영속성컨텍스트
  • 1차 캐시
  • SEQUENCE 전략
  • @JoinColumn
  • TABLE 전략
  • HttpMessageConverter
  • @ManyToOne
  • @RequestParam
  • ReturnValueHandler
  • produces
  • IDENTITY 전략
  • ORM
  • 요청헤더
  • 정렬
  • @Table
  • @GetMapping
  • 백준
  • 영속성
  • @PostMapping
  • HandlerMethodArgumentResolver
  • 동일성보장
  • JPA
  • 엔티티 매핑
  • @Column
  • consumes
  • @Id
  • ViewName반환

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
UL :)

UL의 개발 블로그

[PS] 인프런 강의 - Tree 2. 부분집합 구하기 (DFS)
PS(Java)/인프런 강의 문제

[PS] 인프런 강의 - Tree 2. 부분집합 구하기 (DFS)

2022. 9. 21. 15:43

 

문제

자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 출력하는 프로그램을 작성하세요.

 

▣ 입력설명
첫 번째 줄에 자연수 N(1<=N<=10)이 주어집니다.

 

▣ 출력설명
첫 번째 줄부터 각 줄에 하나씩 부분집합을 아래와 출력예제와 같은 순서로 출력한다.
단 공집합은 출력하지 않습니다.

 

▣ 입력예제 1
3

 

▣ 출력예제 1
1 2 3
1 2
1 3
1
2 3
2
3

풀이

n=3일 때 원소는 {1, 2, 3}이고, 원소를 '사용한다/안한다' 로 경우의 수가 2씩 잡힌다.

따라서 가질 수 있는 모든 부분집합의 경우의 수는  2x2x2 =8이다. 

경우의 수가 2씩 있으므로 자식노드가 2개씩 늘어나는 트리를 깊이 우선 탐색 하면 모든 경우의 수를 구할 수 있다.

 

우선 결과를 저장할 ch배열을 선언한다. 사용할 인덱스는 1~n 이다.

루트 1이 최초로 DFS 함수를 호출한다.

해당 숫자를 사용할 경우 왼쪽으로 내려가고 ch[ i ] 에 1을 저장한다.

사용하지 않을 경우 오른쪽으로 내려가고 ch[ i ] 에 0을 저장한다.

 

다음 그림은 n=3인 트리이고, n=4가 되면 ch 배열을 순회하며 값이 1인 인덱스(i) 만 출력하면 된다

코드

import java.util.Scanner;

public class Main {
	
	static int n;
	static int[] ch;
	
	public static void DFS(int L) {
		if(L == n+1) {
			String tmp="";
			for(int i=1; i<n+1; i++) {
				if(ch[i] == 1) tmp+=(i + " ");
			}
			if(tmp.length() > 0) System.out.println(tmp); //공집합은 출력X
		}
		else{
			ch[L] = 1;
			DFS(L+1); //left (사용)
			
			ch[L] = 0;
			DFS(L+1); //right (사용X)
		}
		
	}
	
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        
        n = in.nextInt(); //1~10
        //1~N 원소를 갖는 부분집합 모두 출력
        ch = new int[n+1]; //인덱스 1~n 
        DFS(1); //1부터 시작
        

    }
}
저작자표시 비영리 변경금지 (새창열림)

'PS(Java) > 인프런 강의 문제' 카테고리의 다른 글

[PS] 인프런 강의 - Tree 4. 송아지 찾기 (BFS)  (0) 2022.09.21
[PS] 인프런 강의 - Tree 3. 이진트리 순회(넓이우선탐색 BFS : 레벨탐색)  (0) 2022.09.21
[PS] 인프런 강의 - Tree 1.이진트리 순회(깊이우선탐색 DFS)  (0) 2022.09.21
[PS] 인프런 강의 - Recursive 4. 피보나치 수열  (0) 2022.09.19
[PS] 인프런 강의 - Recursive 3. 팩토리얼  (0) 2022.09.19
    'PS(Java)/인프런 강의 문제' 카테고리의 다른 글
    • [PS] 인프런 강의 - Tree 4. 송아지 찾기 (BFS)
    • [PS] 인프런 강의 - Tree 3. 이진트리 순회(넓이우선탐색 BFS : 레벨탐색)
    • [PS] 인프런 강의 - Tree 1.이진트리 순회(깊이우선탐색 DFS)
    • [PS] 인프런 강의 - Recursive 4. 피보나치 수열
    UL :)
    UL :)
    백엔드 개발자를 목표로 달리고 있습니다🔥

    티스토리툴바