본문 바로가기
자료구조와 알고리즘/알고리즘

순열

by oncerun 2023. 6. 23.
반응형

 

 

 

순서가 필요한 경우 다음 참고하여 빠르게 구현하도록 한다.

 

next_permutation 함수:


C++ 표준 라이브러리의 <algorithm> 헤더에 있는 next_permutation 함수는 순열(Permutation)을 생성하기 위해 사용됩니다.

 

next_permutation 함수는 현재 순열을 기준으로 다음 순열을 생성하고, 순열이 더 이상 존재하지 않을 때는 false를 반환합니다.

 

int main() {

    int a[] = {1,2,3};

    do{
        for(int i : a) cout << i << " ";
        cout << '\n';
    } while (next_permutation(a, a + 3));
}

 

아래는  next_permutation 함수를 사용하여 배열의 모든 순열을 생성하는 과정을 도식화한 것입니다.

초기 배열: [1, 2, 3]

1. 현재 배열 [1, 2, 3] 출력

2. 다음 순열 생성을 위해 next_permutation 호출
   - 배열 [1, 2, 3]을 기준으로 다음 순열을 생성
   - 다음 순열 [1, 3, 2] 반환, true 반환

3. 현재 배열 [1, 3, 2] 출력

4. 다음 순열 생성을 위해 next_permutation 호출
   - 배열 [1, 3, 2]을 기준으로 다음 순열을 생성
   - 다음 순열 [2, 1, 3] 반환, true 반환

5. 현재 배열 [2, 1, 3] 출력

6. 다음 순열 생성을 위해 next_permutation 호출
   - 배열 [2, 1, 3]을 기준으로 다음 순열을 생성
   - 다음 순열 [2, 3, 1] 반환, true 반환

7. 현재 배열 [2, 3, 1] 출력

8. 다음 순열 생성을 위해 next_permutation 호출
   - 배열 [2, 3, 1]을 기준으로 다음 순열을 생성
   - 다음 순열 [3, 1, 2] 반환, true 반환

9. 현재 배열 [3, 1, 2] 출력

10. 다음 순열 생성을 위해 next_permutation 호출
    - 배열 [3, 1, 2]을 기준으로 다음 순열을 생성
    - 다음 순열 [3, 2, 1] 반환, true 반환

11. 현재 배열 [3, 2, 1] 출력

12. 다음 순열 생성을 위해 next_permutation 호출
    - 배열 [3, 2, 1]을 기준으로 다음 순열을 생성
    - 다음 순열 [1, 2, 3] 반환, false 반환

모든 순열 생성 완료


위의 도식화된 예시에서는 초기 배열 `[1, 2, 3]`을 시작으로 next_permutation 함수를 호출하여 다음 순열을 생성하고 출력합니다. 이 과정을 배열의 모든 순열을 생성할 때까지 반복합니다. 

 

마지막에 next_permutation 함수는 false를 반환하여 순열 생성을 종료합니다.

순열의 생성은 배열의 요소들을 모든 가능한 순서로 재배치하는 과정이며, next_permutation 함수를 사용하면 간편하게 모든 순열을 생성할 수 있습니다.

 

* tip

 c++11 도입된 for-each 루프 혹은 range-based for loop 인 for(int :i :a)와 같은 형태의 문법이 있다.

 

해당 문법은 배열, 벡터, 리스트 등과 같은 각 요소를 순차적으로 접근하기 위해 단순하고 간결한 방법을 제공한다. 

 

for(int i : a)

 

위 예시에서 a는 컨테이너를 나타내며, int it는 각 요소를 참조할 변수를 나타낸다. 

 

실제로 컨테이너의 인덱스나 크기를 사용하지 않아 매우 간결한 가독성을 제공해준다는 점이 특징이다.

 

반응형

'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글

prefix sum  (0) 2023.06.25
c++ split  (0) 2023.06.23
Recursion  (0) 2023.06.23
1. 선택정렬  (0) 2021.05.30
Shell Sort 셸 정렬  (0) 2021.05.30

댓글