[알고리즘] 순열, 조합 응용: Next Permutation

2024. 8. 19. 15:16·CS/알고리즘

0. Next Permutation

현 순열에서 사전 순으로 다음 순열을 생성하는 것

 

이를 이용하여 순열과 조합을 표현할 수 있다.

재귀를 통해 구현한 순열, 조합보다 빠르다는 장점을 가지고 있다.

하지만 nPn만 가능하다는 단점을 가지고 있다.


1. 알고리즘

  • 배열을 오름차순으로 정렬한다.
  • 아래 과정을 반복하여 사전 순으로 다음을 큰 순열을 생성한다.(가장 큰 순열을 만들 때까지 반복)
    1. 뒤에서부터 탐색하며 교환 위치(pivot) 찾기 → 최초로 pivot < pivot+1이 되는 위치
    2. 뒤에서부터 탐색하며 교환 위치(pivot)와 교환할 위치(successor) 찾기 → pivot < successor 중 가장 작은 값의 위치
    3. 두 위치(pivot, successor) 값 교환
    4. 교환 위치(pivot)의 뒷 부분을 오름차순으로 정렬
  • NextPermutation 사용 전에 숫자배열을 오름차순으로 정렬한 시작 시점의 순열을 한 번 처리해야 한다.

2. 순열 코드


3. 조합 코드

nCr일 때, n개의 배열에 r개에는 1을 (n - r)개에는 0을 저장한다.

생성한 배열에 Next permutation과 동일한 알고리즘을 적용한다.

각 배열 값에서 1이면 선택, 0이면 미선택으로 생각하면 조합이 된다.

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'CS/알고리즘' 카테고리의 다른 글
  • [알고리즘] 이진 탐색(Binary Search)
  • [알고리즘] 탐욕 알고리즘(Greedy Algorithm)
  • [알고리즘] 순열, 조합, 부분 집합
  • [알고리즘] 비선형 자료구조 완전탐색: BFS/DFS
Dreaming-J
Dreaming-J
개발자로 성장해가는 과정을 기록하기 위한 공간
    반응형
  • Dreaming-J
    꿈꾸는 개발 공간
    Dreaming-J
  • 전체
    오늘
    어제
    • 카테고리 (46)
      • Infra (2)
      • CS (25)
        • 네트워크 (3)
        • 운영체제 (3)
        • 자료구조 (4)
        • 알고리즘 (15)
      • JAVA (10)
        • IntelliJ (1)
        • Stream (2)
        • String (4)
        • Map (1)
        • 기타 (1)
      • Git·Github (7)
      • 독서 (2)
        • 객체지향 설계 (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    집합
    조합
    탐색
    dp
    플로이드-워샬
    Git
    Prim
    string
    disjoint
    워샬
    stream
    Binary search
    코딩테스트
    순열
    그래프
    github
    Kruskal
    0/1 knapsack
    다익스트라
    sort
    정렬
    Dijkstra
    GitLab
    워셜
    0/1
    자료구조
    동적 계획법
    독서
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Dreaming-J
[알고리즘] 순열, 조합 응용: Next Permutation
상단으로

티스토리툴바