페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#8556

Tutorial : STL Reverse 2s 1024MB

문제

앞선 STL Sort 정렬 기준 설정 문제 에서 우리는 원하는 대로 정렬 기준을 설정할 수 있었다.

이를 이용하면 내림차순 정렬은 쉽게 구현할 수 있다.

bool comp(int Left, int Right){
    return Left > Right;
}

int main(){
    int A[5] = {1, 2, 3, 4, 5};
    sort(A+0, A+5, comp);
}

배열에서 오른쪽으로 갈수록 숫자가 작아져야 하기 때문에, 왼쪽 숫자(Left) 보다 오른쪽 숫자(Right) 가 작도록 comp 를 짜면 된다.


약간의 발상의 전환을 하면 이렇게도 생각할 수 있다.

"오름차순으로 정렬해놓고, 배열 전체를 뒤집으면 되지 않을까?"

이것 또한 정답이다. 따라서 이번에는 배열의 원하는 구간을 뒤집는 reverse 함수를 배울 것이다.


reverse 함수는 사용법이 sort 함수와 완전히 동일하다.

배열 A 의 s 번 칸부터 e 번 칸까지를 뒤집고 싶다면, 아래 코드를 짜주면 된다.

reverse ( A + s , A + e + 1 );

reverse 함수도 sort 와 마찬가지로 #include <algorithm> 헤더에 있고, using namespace std; 를 해줘야 한다.


배열 A의 모습이 위와 같다. 여기에 아래 코드를 적용하면,

reverse ( A + 1 , A + 5 );

A[1] ~ A[4] 가 뒤집히고, 배열 A는 아래와 같이 변한다.

시간복잡도는 당연히 O( 뒤집히는 구간의 길이 ) 가 된다.



입력

첫 줄에 정수의 개수 N 이 입력된다. ( 1 ≤ N ≤ 100,000 )

두 번째 줄에 A[0], A[1], ..., A[N - 1]이 입력된다. ( 모두 int 범위의 정수 )

마지막 줄에 뒤집고 싶은 구간을 나타내는 두 정수 x y 가 입력된다. ( 0 ≤ x ≤ y ≤ N - 1 )


출력

첫 번째 줄에는 A[x] ~ A[y] 까지 뒤집은 결과를 출력한다.

두 번째 줄에는 배열 A 를 내림차순으로 정렬한 결과를 출력한다.


예제

9
10 5 7 4 8 2 6 8 5
1 4
10 8 4 7 5 2 6 8 5
10 8 8 7 6 5 5 4 2



출처

againalgo

로그인해야 코드를 작성할 수 있어요.