[Algorithm] 순열/중복 순열 알고리즘 구현 (C++)

2022. 5. 4. 20:40·Algorithm/Study
728x90

 

1. 순열

 

1. swap을 이용한 재귀함수 구현 => 사전순 출력x

#include <iostream>
#include <vector>
#include <algorithm> 
using namespace std;

int n;
vector<int> v(10);

void permutation(int s, int e) {
    if (s == e) {
        for (int i = 0; i < n; i++) {
            cout << v[i] << " ";
        }
        cout << endl;
    }
    else {
        for (int i = s; i <= e; i++) {
            swap(v[s], v[i]);
            permutation(s + 1, e);
            swap(v[s], v[i]);
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(nullptr);

    cin >> n;
    for (int i = 0; i < n; i++) {
        v[i] = i + 1;
    }
  
    permutation(0, n - 1);
        
}

✅ 설명 :  순열 알고리즘 (Permutation Algorithm) (tistory.com)

 

 

2. 재귀함수와 visited배열을 이용하여 구현 (dfs) => 사전 순 출력

#include <iostream>
#include <vector>
#include <algorithm> 
using namespace std;

int n;
int v[10];
bool visited[10];
int result[10];

void permutation(int depth) {
    if (depth == n) {
        for (int i = 0; i < n; i++) {
            cout << result[i] << " ";
        }
        cout << endl;
    }

    for (int i = 0; i < n; i++) {
        if (!visited[i]) {
            visited[i] = 1;
            result[depth] = v[i];
            permutation(depth + 1);
            visited[i] = 0;
        }
    }

}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(nullptr);

    cin >> n;

    for (int i = 0; i < n; i++) {
        v[i] = i + 1;
    }

    permutation(0);
        
}

✅ 설명 : [알고리즘] 순열(Permutation) 알고리즘 : 네이버 블로그 (naver.com)

 

+ stl 이용(next_permutation)

#include <iostream>
#include <algorithm>
using namespace std;
 
int main() {
    int v[3] = { 1, 2, 3};
 
    sort(v, v+3);
 
    do {
        for(int i=0;i<3;i++)
            cout << v[i] << ' ';
        cout << endl;
    } while (next_permutation(v, v+3));
    
}

 

 

2. 중복 순열

- 방문 처리가 필요 없다.

int n, r, arr[10], result[10];
void permutation(int depth) {
    if (depth == r) {
        for (int i = 0; i < r; i++) {
            cout << result[i] << " ";
        }
        cout << "\n";
    }
    else {
        for (int i = 0; i < n; i++) {
            result[depth] = arr[i];
            permutation(depth + 1);
        }
    }
}

 

 

3. 조합

1) 재귀함수를 이용한 점화식 방법

#include <iostream>

using namespace std;

int n, m, arr[10], result[10];

void combination(int r, int idx, int depth){
    if(r==0){
        for(int i=0;i<m;i++){
            cout << result[i] << " ";
        }
        cout << "\n";
    }else if(depth == n){
        return;
    }else {
        result[idx] = arr[depth];
        combination(r-1,idx+1,depth+1); // n-1Cr-1
        combination(r, idx,depth+1);  // n-1Cr
    }
}
int main()
{
    cin >> n >> m;
    for(int i=0;i<n;i++){
        cin >> arr[i];
    }
    combination(m,0,0);
    
}

 

2) https://yabmoons.tistory.com/99

728x90
저작자표시 비영리 (새창열림)

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

[바킹독의 실전 알고리즘] 0x01강 ~ 0x02강  (0) 2022.09.13
[코딩 테스트를 위한 자료 구조와 알고리즘 with C++] 1장 정리  (0) 2022.09.05
[이것이 취업을 위한 코딩 테스트다] Chpater 8 - DP  (0) 2022.03.24
[이것이 취업을 위한 코딩 테스트다] Chapter 03 - 그리디(Greedy)  (0) 2022.03.08
[Algorithm] 유니온 파인드(Union-Find) 개념, 코드(C++)  (2) 2021.05.20
'Algorithm/Study' 카테고리의 다른 글
  • [바킹독의 실전 알고리즘] 0x01강 ~ 0x02강
  • [코딩 테스트를 위한 자료 구조와 알고리즘 with C++] 1장 정리
  • [이것이 취업을 위한 코딩 테스트다] Chpater 8 - DP
  • [이것이 취업을 위한 코딩 테스트다] Chapter 03 - 그리디(Greedy)
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    lisp
    C++
    프로그래머스
    Algorithm
    파일처리
    리팩토링
    자료구조
    백준
    react
    데브코스
  • hELLO· Designed By정상우.v4.10.2
BeNI
[Algorithm] 순열/중복 순열 알고리즘 구현 (C++)
상단으로

티스토리툴바