[C++ / 백준 10972번] 다음 순열

2024. 12. 29. 18:07·프로그래밍 공부/백준 (C++)

 

 

 

다음 순열을 구하는 문제이다. 처음에는 백트래킹, dfs, 재귀 를 전부 사용해 모든 순열을 찾아가다가 조건에 맞으면 출력하는 방식을 선택하려고 했는데, 범위가 10000 까지이므로 시간 초과가 났다.

 

 

<시간 초과가 난 코드>

 

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

using namespace std;

int N;

vector<int> v;
vector<int> input_v;

bool visited[100001] = {false};


bool same = false;

void dfs(int input)
{
    if(input == N)
    {
        if(same)
        {
            for(auto i : v)
            {
                cout << i << " ";
            }
            same = false;
            return;
        }

        if(v == input_v)
        {
            same = true;

        }

        return;
    }
    else
    {
        for(int i = 0 ; i < N ; i++)
        {
            if(!visited[i])
            {
                visited[i] = true;
                v.push_back(i+1);

                dfs(input + 1);

                v.pop_back();
                visited[i] = false;


            }

        }

    }


}


int main() {

    cin >> N;

    int tmp;
    for(int i = 0 ; i < N ; i++)
    {
        cin >> tmp;
        input_v.push_back(tmp);
    }

    bool issame = false;

    for(int i = 0 ; i < input_v.size(); i++)
    {
        if(i+1 == input_v[N-1-i])
        {
            issame = true;
        }
        else issame = false;
    }

    if(issame)
    {
        cout << "-1";
        return 0;
    }

    dfs(0);







    return 0;
}

 

 

다시 살펴보니 시간 초과가 날 수 밖에 없어 보였다.

시간복잡도 문제를 어떻게 해결할 지 생각해보았는데 검색 중

 

C++ stl 함수인 next_permutation() 함수가 있다는 것을 알게 되었다.

자바나 파이썬에는 없다는데, 이런 것까지 있어? 싶어서 내심 놀라웠다.

 

 

next permuation 구현에 대한 내용은 아래 블로그를 참고했다.

간단히 말하자면 가장 긴 감소 부분수열을 찾아 스왑하며 다음 순열을 찾는 것이다.

시간 복잡도가 최대 N으로 평균적으로는 1 정도 걸리는 듯 하다.

 

https://foxtrotin.tistory.com/387

 

순열 next_permutation()과 prev_permutation() 직접 구현하기

순열 next_permutation()과 prev_permutation() 직접 구현하기 다음 순열, 이전 순열, 모든 순열 순열 크기 n이 3인 수열을 사전순으로 나열하면 다음과 같다 123 132 213 231 312 321 n=3인 수열은 총 6개가 있다 여

foxtrotin.tistory.com

 

 

 

<정답 코드>

 

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

using namespace std;

int N;
vector<int> input_v;

void solve() {
    // 현재 벡터가 마지막 순열이면 -1 출력
    if (!next_permutation(input_v.begin(), input_v.end())) {
        cout << "-1";
        return;
    }
    // 다음 순열 출력
    for (int i : input_v) {
        cout << i << " ";
    }
}

int main() {
    cin >> N;

    input_v.resize(N);
    for (int i = 0; i < N; i++) {
        cin >> input_v[i];
    }

    solve();
    return 0;
}

'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글

[C++ / 백준 14889번] (재귀 / 비트마스크) 스타트와 링크  (0) 2025.01.07
[C++ / 백준 1759번] 암호 만들기  (0) 2025.01.05
[ C++ / 백준 15663번 ] N과 M (9)  (0) 2024.12.28
[백준 15649번, 15650번 / C++] N과 M  (0) 2024.12.19
[C++ / 백준 14500번] 테트로미노  (0) 2024.12.07
'프로그래밍 공부/백준 (C++)' 카테고리의 다른 글
  • [C++ / 백준 14889번] (재귀 / 비트마스크) 스타트와 링크
  • [C++ / 백준 1759번] 암호 만들기
  • [ C++ / 백준 15663번 ] N과 M (9)
  • [백준 15649번, 15650번 / C++] N과 M
Rocketbabydolls
Rocketbabydolls
Rocketbabydolls
  • Rocketbabydolls
    With The Lights Out
    Rocketbabydolls
  • 전체
    오늘
    어제
    • 전체글 (183) N
      • 프로그래밍 공부 (117)
        • C (16)
        • Jumping into C++ (9)
        • MFC (C++) (1)
        • 자료구조 (1)
        • 알고리즘 (1)
        • 백준 (C++) (74)
        • 핸즈온 머신러닝 2판 (6)
        • Unseen 3기 준비 (4)
        • 원티드 포텐업 게임 개발자 양성과정 2기 (4)
      • 언리얼엔진5 (62) N
        • [Part1] 이득우의 언리얼 프로그래밍 (12)
        • [Part2] 이득우의 언리얼 프로그래밍 (2)
        • [Part2 복습] 이득우의 언리얼 프로그래밍 (3)
        • [Part3] 이득우의 언리얼 프로그래밍 (14)
        • [Part4] 이득우의 언리얼 프로그래밍 (0)
        • FPS 게임 1인 프로젝트 (6)
        • 각종 지식 (10) N
        • 블루프린트 Paper2D 로 게임 만들기 (14)
        • 팀 프로젝트 (1)
      • 일상 (1)
      • ETC (1)
        • 맥북 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      실전 C프로그래밍
      오블완
      실전 C 프로그래밍
      실전C프로그래밍
      c언어
      언리얼엔진
      실전 C프로그래밍 나중채
      실전 C프로그래밍 실습문제
      언리얼엔진 옵저버 패턴
      언리얼엔진 중재자 패턴
      C언어 실습문제
      언리얼엔진5
      핸즈온 머신러닝 2판
      언리얼엔진 디자인 패턴
      언리얼엔진5 fps 프로젝트
      실전C프로그래밍 실습문제
      티스토리챌린지
      핸즈온 머신러닝
      실전C프로그래밍 나중채
      c++ 17298
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    Rocketbabydolls
    [C++ / 백준 10972번] 다음 순열
    상단으로

    티스토리툴바