[백준] 10973_이전 순열 C++


순열 조합 구현 문제

정답제출코드


#include <iostream>
#include <algorithm>

using namespace std;

int num[10000] = {0, };
int N;

bool desc(int a, int b)
{
    return a > b;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin >> N;
    
    for (int i = 0; i < N; ++i)
        cin >> num[i];
    
    bool flag = false;
    for (int i = N - 1; i > 0; --i)
    {
        if(num[i - 1] > num[i])
        {
            int idx = i;
            for (int j = N - 1; j >= i; --j)
            {
                if(num[i - 1] > num[j] && num[j] > num[idx])
                    idx = j;
            }
            
            int temp = num[idx];
            num[idx] = num[i - 1];
            num[i - 1] = temp;
            
            sort(num + i, num + N, desc);
            
            flag = true;
            break;
        }
    }

    if (!flag)
        cout << -1;
    else
        for (int i = 0; i < N; ++i)
            cout << num[i] << ' ';
    
    return 0;
}


풀이 과정은 아래와 같다.

  • 기존 수열의 맨 오른쪽부터 하나씩 왼쪽 원소가 오른쪽 원소보다 큰지 검사한다.
  • 조건에 맞으면 그 왼쪽 원소를 중심으로 오른쪽에 존재하는 원소들 중에서 해당 원소보다 작은 값 중 가장 큰 값 을 찾으면 된다.
  • 그렇게 찾은 값을 기준의 값과 교환한다.
  • 다시 기준을 중심으로 오른쪽 원소들을 내림차순 정렬하면 된다.

© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2