<ALGORITHM>/SUMMARIZE

1. 역순(Reverse)

CodeGrimie 2021. 1. 17. 19:47

역순(Reverse)의 개념

역순(Reverse)은 앞에서 n번째 값뒤에서 n번째 값을 차례로 교환한다.

두 값을 교환하기 때문에 배열 길이의 절반의 순환문만 돌면 된다.

 

만약 배열 길이만큼 돈다면 역순의 역순이라 다시 본래의 순서대로 된다.

 

▼앞에서 n번째와 뒤에서 n번째를 교환한다.

C99

▼ 관련 개념

Loop & Pointer & Call By Address

 

▼ 구현 코드

void Swap(int* lhs, int* rhs)
{
    int _temp = *lhs;
    *lhs = *rhs;
    *rhs = _temp;
}

void Reverse(int iArr[], int length)
{
    for (int i = 0; i < (length / 2); i++)
    {
        Swap(&iArr[i], &iArr[length - i - 1]);
    }
}

For문 안에서 (length / 2)로 배열 길이의 절반만 작동하는 것이 중요하다.

내부적으로 (length / 2)int로 되기 때문에 소수점은 사라진다.

CPP B.11

▼ 관련 개념

Loop & STD

 

▼ 구현 코드

#include <algorithm>

void Reverse(int iArr[], int length)
{
    for (int i = 0; i < (length / 2); i++)
    {
        std::swap(iArr[i], iArr[length - i - 1]);
    }
}

CPP A.98 <algorithm> 라이브러리를 사용한 방법이다.

교환 함수의 개념을 이해하고 있다면 직접 구현한 함수보다 내장 라이브러리 함수를 사용하는 편이 속도가 훨씬 빠르다.

참조자(&)를 사용한 교환 함수는 0. 교환 함수(Swap)를 살펴보자.

CPP A.17

▼ 관련 개념

STD

 

▼ 구현 코드

#include <algorithm>

int main()
{
    std::array<int, 5> iArr = { 5, 4, 3, 2, 1 };
    
    std::reverse(iArr.begin(), iArr.end());
    return (0);
}

CPP A.17 <algorithm>의 std::reverse 함수를 사용해서 역순으로 정렬한다.

마찬가지로 프로그래머가 직접 짠 역순 정렬 함수보다 훨씬 빠른 처리 속도를 가진다.

 

CPP의 최신 표준에 가까울수록

프로그래머가 로직에 좀 더 집중할 수 있도록 하는 언어 철학이 두드러짐을 알 수 있다.

 

점차 코딩 테스트에서 사용되는 컴파일러가 CPP A.17로 되고 있다.

역순 정렬 자체를 구현하는 게 아니라면 표준 함수를 사용하여 로직에 집중하는 것이 좋다.

 

하지만 어디까지나 알고 있기 때문에 편리하기 위해서 사용하는 것이지

내부 작동 원리를 모르면서 사용하는 것은 학습에 도움되지 않는다.