[자료구조/알고리즘] 재귀 함수를 이용한 부분 집합 생성 알고리즘

2021. 1. 6. 21:36·Algorithm/Algorithm
#define _CRT_SECURE_NO_WARNINGS                                
#include <iostream> 
#include <vector> 
using namespace std;
vector<int> subset;
int n = 4;
void search(int k)
{
    if (k == n + 1)
    {
        for (int i = 0; i < subset.size(); i++)
            cout << subset[i] << " ";
        cout << endl;
    }
    else
    {
        subset.push_back(k);
        search(k + 1);
        subset.pop_back();
        search(k + 1);
    }
}
int main()
{
    search(1);
}

1부터 n까지의 숫자로 만들 수 있는 부분 집합의 경우의 수를 출력하는 함수다.

마지막 공집합은 빈 줄로 출력이 되기 때문에 실수로 놓치는 것에 주의한다.

 

우리가 부분집합을 손으로 (가지치기하여) 구할 때와 유사한 방식이라고 생각한다.

다만 재귀 알고리즘은 익숙하지 않으면 코드 자체를 보고 실행결과를 예상하기가 힘들다.

 

실행 결과

 

아래는 n = 7 , r = 4 라고 가정하고 7C4의 경우를 모두 출력하는 코드이다.

#include <iostream>
#include <vector>
using namespace std;
vector<int> comb;
int n = 7, r = 4;
void combination(int k)
{
    if (comb.size() == r)
    {
        for (int i = 0; i < comb.size(); i++)
            cout << comb[i] << " ";
        cout << endl;
    }
    else if (k == n + 1) return;
    
    else
    {
        comb.push_back(k);
        combination(k + 1);
        comb.pop_back();
        combination(k + 1);
    }
}
int main()
{
    combination(1);
    return 0;
}

실행 결과


출처: https://doomed-lab.tistory.com/60?category=763786 [둠선생 연구실]

'Algorithm > Algorithm' 카테고리의 다른 글

118667. 두 큐 합 같게 만들기  (0) 2025.02.26
[자료구조/알고리즘] Eulerian circuit(한붓그리기)  (0) 2021.01.13
[자료구조/알고리즘] 비트연산을 통한 순열  (0) 2021.01.11
[자료구조/알고리즘] 해시(Hash) 란?  (0) 2021.01.06
'Algorithm/Algorithm' 카테고리의 다른 글
  • 118667. 두 큐 합 같게 만들기
  • [자료구조/알고리즘] Eulerian circuit(한붓그리기)
  • [자료구조/알고리즘] 비트연산을 통한 순열
  • [자료구조/알고리즘] 해시(Hash) 란?
사랑우주인
사랑우주인
  • 사랑우주인
    lovelyAlien
    사랑우주인
  • 전체
    오늘
    어제
  • 글쓰기
    관리
    • 분류 전체보기 (209)
      • Programming (4)
        • Spring (28)
        • Java (46)
        • JPA (2)
        • 디자인 패턴 (5)
        • 개발&아키텍처 (0)
      • Network (14)
      • OS (19)
      • Database (1)
      • Kubernetes (0)
      • Kafka (2)
      • Algorithm (49)
        • BaekJoon (1)
        • Programmers (19)
        • Algorithm (5)
        • Socar (2)
        • LeetCode (19)
      • Interview (2)
      • Issues (2)
      • DotJoin (1)
      • Git (4)
      • 독서 (3)
      • 끄적끄적 (1)
      • 외부활동 (26)
        • 항해플러스 (2)
        • JSCODE 네트워크 (19)
        • JSCODE 자바 (5)
      • SQL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Oauth2
    Thread
    clone graph
    algorithm
    AuthenticationSuccessHandler
    fcfs
    BFS
    wildcards
    트랜잭션
    Reorder List
    rotting oranges
    Generic
    추상화 클래스
    제네릭
    준영속 엔티티
    minimum number of arrows to burst balloons
    Process
    디자인 패턴
    운영체제
    Climbing Stairs
    runner 기법
    @JsonProperty
    pacific atlantic water flow
    RR
    LinkedList
    @JsonNaming
    socar
    lower bounded wildcards
    OS
    JSCode
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
사랑우주인
[자료구조/알고리즘] 재귀 함수를 이용한 부분 집합 생성 알고리즘
상단으로

티스토리툴바