티스토리 뷰

DS\Algo

BOJ 1083 소트

MathTrauma 2022. 11. 11. 07:37

 

문제 링크 : https://www.acmicpc.net/problem/1083

 

1083번: 소트

크기가 N인 배열 A가 있다. 배열에 있는 모든 수는 서로 다르다. 이 배열을 소트할 때, 연속된 두 개의 원소만 교환할 수 있다. 그리고, 교환은 많아봐야 S번 할 수 있다. 이때, 소트한 결과가 사전

www.acmicpc.net

 

가장 앞자리부터 가능한한 큰 수로 교환하고,

교환 횟수가 남아있다면 그 다음 자리로 가서 이를 반복한다.

 

알고리즘은 더 설명할 게 없고,

아래 코드에서 algorithm 라이브러리에 있는 rotate 함수를 설명하면 충분할 듯하다.

 

rotate( arr+start , arr+p , arr+end );

arr 이 배열인 경우 [ start , end ) 에 존재하는 원소들을 p 에 위치한 것이 가장 앞에 올 때까지

왼쪽으로 이동시킨다. (물론 선두인 start 위치의 것은 end-1로 보낸다.)

 

다음과 같은 알고리즘으로 구현되어 있다고 한다.

 

template <class ForwardIterator>
  void rotate (ForwardIterator first, ForwardIterator middle,
               ForwardIterator last)
{
  ForwardIterator next = middle;
  while (first!=next)
  {
    swap (*first++,*next++);
    if (next==last) next=middle;
    else if (first==middle) middle=next;
  }
}

 

(정말 구현이 위와 같이 된 것은 아니고 위의 코드와 동등하다고 설명되어 있다.)

어쨌든 이 코드는 이해하기 쉽지 않다.

더우기 정말 배열의 원소들의 값을 교환하고 있어서 효율이 좋아 보이지도 않는다.

 

원래는 모듈러(modular) 연산을 이용하여 rotate 함수와 같은 결과를 만드는 함수를 작성해서 풀었지만...

코드가 못생겨져서 그냥 rotate 함수를 사용했다.

 

 

반응형

'DS\Algo' 카테고리의 다른 글

BOJ 14888 연산자 끼워넣기  (0) 2022.12.19
BOJ 5905 악당 로봇 (Video Game)  (0) 2022.10.30
BOJ 2477 참외밭  (2) 2022.10.30
BOJ 1517 버블 소트  (0) 2022.10.26
BOJ 2357 최솟값과 최댓값  (0) 2022.10.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함