프리미엄
예측대회
투자분석
아카데미
커뮤니티
로그인Valley AI 시작하기시작하기
Valley Space인기
C++ next_permutation으로 순열, 조합 구현하기
FrugalBoy's JourneyLeetcode유형

C++ next_permutation으로 순열, 조합 구현하기

avatar
FrugalBoy
2025.02.19조회수 15회
avatar
FrugalBoy
구독자 5명구독중 12명
Wanna live like a frugal boy For the genetically superior, success is easier to attain. But it is by no means guaranteed. After all, there is no gene for fate -Gattaca-


1. next_permutation 이해하기

  • 역할: [first, last) 범위 내 요소를 사전순(next lexicographical order)으로 다음 순열로 바꿈.

  • 반환값:

    • 다음 순열이 존재하면 true

    • 다음 순열이 없으면(즉, 마지막 순열이면) false (초기 상태로 돌아가려면 reverse() 사용)

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

int main() {
    vector<int> arr = {1,3,5,7};
    cout << next_permutation(arr.begin(),arr.end()) << '\n'; // 1 출력 -> True: 다음순서가 있음을 의미
    for(int n : arr) cout << n << " "; // 1 3 7 5  -> 위의 next_permutation으로 다음 순번의 숫자들로 정렬됨

    return 0;
}

2. next_permutation에 쓸 배열은 sort 돼 있어야 한다

ex.

순열구할시

arr = {1,2,3,4}

코드:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4}; // 사전순으로 가장 작은 상태

    do {
        for (int i = 0; i < v.size(); ++i) cout << v[i] << " ";
        cout << "\n";
    } while (std::next_permutation(v.begin(), v.end())); // 다음 조합 생성

    return 0;
}


조합 구할 시

arr = {0,0,1,1}

코드:

#include <iostream>
#include <algorithm>
...

회원가입만 해도
이 글을 무료로 읽을 수 있어요.

Basic 7일 무료 체험 시작하기
이미 계정이 있으신가요?로그인하기
댓글 0개
아직 작성된 댓글이 없습니다.
Leetcode유형 카테고리의 다른글

재귀함수 Time complexity && Space Complexity 구하는 법

재귀 함수를 분석할 때, 시간 복잡도(Time Complexity)와 공간 복잡도(Space Complexity)를 구하는 전형적인 방법에 대해 알아보겠습니다. 일반적으로 다음 단계를 거쳐 복잡도를 도출할 수 있습니다. 1. 시간 복잡도(Time Complexity) 구하는 방법 1.1 재귀 함수의 호출 구조 파악 가장 먼저 해야 할 일은 재귀 함수가 어떻게(몇 번) 호출되는지, 그리고 각 호출마다 걸리는 시간이 어느 정도인지 파악하는 것입니다. 함수가 한 번 호출될 때 마다 몇 번의 재귀 호출을 하는가? 각 재귀 호출에서 문제의 크기가 어떻게 변하는가(n→n/2, n→n-1 등)? 재귀 호출 외에 부가적으로 반복문이나 다른 연산(예: 배열을 순회하는 O(n) 작업)이 있는가? 1.2 점화식(Recurrence Relation) 세우기 함수 호출 구조를 바탕으로 점화식을 세웁니다. 예를 들어, 단일 호출 예시 T(n)=T(n−1)+O(1)T(n) = T(n-1) + O(1) 이는 “한 번의 함수 호출에서 다시 한 번의 재귀 호출을 하고, 그 외엔 상수 시간이 걸린다”는 뜻입니다. 예: n부터 1까지 순차적으로 내려가며 단순 계산하는 재귀 이진 분할 예시 T(n)=2T(n2)+O(n)T(n) = 2T\Bigl(\frac{n}{2}\Bigr) + O(n) 이는 “한 번의 함수 호출에서 2번의 재귀 호출을 하고, 재귀 호출 외에 O(n) 시간이 걸린다”는 뜻입니다. 예: merge sort, quick sort(평균적으로), binary tree 탐색 등 분할 정복(divide & conquer) 유형 T(n)=a×T(nb)+f(n)T(n) = a \times T\Bigl(\frac{n}{b}\Bigr) + f(n) 여기서 aa는 재귀 호출 횟수, n/bn/b는 입력 크기 분할 비율, f(n)f(n)은 ...
Leetcode유형
2025. 02. 17
2
0
2

DFS vs BFS

 특정 문제들은 bfs로 풀때 TLE로 안풀린다 내가 생각한 이유: bfs는 2d matrix에서 4방향을 검색하면서 나아간다 하지만 dfs의 경우 특정조건을 만족하는 경우로 한방향을 빠르게 골라 직선형태로 이리저리 빠르게 나아간다 둘의 움직임 볼수 있는 사이트 https://sjunhong.github.io/algorithm-visualizer/ 따라서 데이터가 많을때 bfs에서 TLE가 나오는게 dfs에서 나오지 않을때가 있음 아래 2문제는 bfs로 풀면 tle나오는 유형들임 https://leetcode.com/problems/count-sub-islands/description/ https://leetcode.com/problems/word-search/description/ 
Leetcode유형
2025. 02. 04
1
0
4

2. Sliding Window 중요

 유형1. Window size가 정해져 있지 않은 케이스: i, j 움직여가면서 조건에 맞는 놈 생길때마다 window size가 바뀜 Template: 크게 2가지 step으로 이뤄짐 Expand Window: for문 안에서 첫부분에 j++하는 부분 Shrink Winow: while( invalid) 문에서 i++하는 부분 세부 접근법: invalid한 상태가 무엇인지 먼저 생각해라 -> 그래야 for문 안의 while문을 먼저 짤 수 있음 invalid 발상 떠올리는법: i=0, j=0에서 시작해서 j가 한칸씩 오른쪽으로 간다. 이렇게 j를 한칸씩 움직이면서 어떨때 invalid할지 생각하기 int i = 0, j = 0, ans = 0; for (; j < N; ++j) { // CODE: use A[j] to update state which might make the window invalid for (; invalid(); ++i) { // when invalid, keep shrinking the left edge until it's valid again // CODE: update state using A[i] } ans = max(ans, j - i + 1); // the window [i, j] is the maximum window we've found thus far } return ans; 가장 정석적인 문제: ...
Leetcode유형
2025. 01. 23
1
0

1. Two pointers

 유형 left = 0, right = n-1 while(left < right){ if() left++; if() right--; } 이때 two pointer를 쓰려면 sorted 된 array이어야한다 그렇지 않으면 TC상 이점이 없음 -> ex. Two Sum 문제의 경우 Sort 되지 않은 array면 hashmap으로 푸는게 two pointers로 푸는 것보다 빠름 예제: https://leetcode.com/problems/reverse-string/description/ https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/ 
Leetcode유형
2025. 01. 23
1
0
3
4