덴바의 노트

내일배움캠프 13일차 TIL 본문

프로그래밍 노트/TIL

내일배움캠프 13일차 TIL

덴바 2024. 5. 2. 21:58

 

오늘의 키워드
  • Swap
  • 선택 정렬

 

오늘은 기본적으로 알아두면 좋은 간단한 알고리즘에 대해서 포스팅 해보고자 합니다.

 

 


Swap


 

 

Swap이란 A, B가 있으면 둘의 위치를 바꿔서 B, A로 교대, 교환 같은 의미입니다.

 

 

 

 

 

Swap을 하는 메서드를 만드는 것은 정말 별겨 없습니다.

 

만약 A와 B가 서로 양손에 물건을 들고 있고, 해당 물건을 교환하고 싶으면 어떻게 해야할까요?

 

누구 한 명이 물건을 바닥에 두거나, 옆에 있는 또다른 사람에게 잠깐 들고 있어줄래? 하고 부탁할 것입니다.

 

그렇습니다. 여기서 바닥 또는 또다른 누군가가 임시 변수인 Temp입니다.

 

1. A가 Temp에게 본인이 들고 있는 것을 준다.

 

2. A가 B로부터 물건을 받는다.

 

3. B가 Temp에게 A가 가지고 있던 물건을 받는다.

 

이렇게하면 손 쉽게 물건을 교환할 수 있습니다.

 

 

        public void Swap(ref int a, ref int b)
        {
            int temp = 0;
            temp = a;
            a = b;
            b = temp;
        }

 

즉 위와 같은 코드라면 손쉽게 데이터를 주고 받을 수 있을 것입니다.

 


 


Sort


다음은 정렬 알고리즘 중 제 기준 가장 쉽다고 생각드는 선택 정렬입니다.

 

 

 

 

선택 정렬이란

 

배열의 첫 번째 값을 기준으로 그 다음 값 부터 마지막까지를 비교하며,

 

가장 작은 값을 해당 위치에 두는 방식입니다.

 

그리고 그 기준을 1개씩 올려가며,

 

배열의 1칸 이전까지 값을 비교해갑니다.

 

 

그러면 코드는 어떻게 해야 할까요?

 

순차적으로 한 칸씩 비교해가는 포인터가 2개 있습니다.

 

이 뜻은 즉, 이중 반복문을 요구한다는 것입니다.

 

 

        public void SelectionSort(int[] arr)
        {
            for(int i = 0; i < arr.Length-1; i++)
            {
                for(int j = i+1; j < arr.Length; j++)
                {
                    if (arr[i] > arr[j])
                    {
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
        }

 

 

첫 반복문은 배열의 마지막의 한 칸 앞까지 이동하며

 

두 번째 반복문은 i보다는 한 칸 앞서서 끝까지 이동합니다.

 

동시에 기준점인 i의 위치한 값이 비교점 보다 큰 경우,

 

기준점 위치을 비교점으로 Swap시 해당 값으로 더 낮은 값. 즉, 오름차순된 값이 들어갑니다.

 


 

 

오늘의 회고

 

오늘은 알고리즘 기초 중 알아두면 매우 좋은 기능들에 대해서 포스팅 했습니다.

 

해당 내용을 포스팅한 이유는 오늘 부트 캠프에서 본 C# 코딩 테스트 때문입니다.

 

주로 Swap과 정렬에 대한 퀴즈가 많이 나왔습니다.

 

저는 2, 3개 정도의 정렬 알고리즘을 어느 정도 숙달해뒀기에 상당히 쉬웠습니다.

 

하지만, 팀원 중에 정렬 알고리즘을 모르거나 Swap 코드를 구현을 못해서,

 

아쉬워 했던 일이 있었기에 오늘은 위와 같은 내용을 포스팅 했습니다.

 

Swap이나 정렬 알고리즘은 정말로 많이 사용되는 것이기에,

 

해당 포스트를 보신 분들은 읽어보시고 연습도 해보시면 좋을 것 같습니다.

 

하지만, 선택 정렬은 가장 구현하기 쉽지만,

 

정렬 시 검색해야할 배열의 내용이 많을수록 성능은 매우 안좋아집니다.

 

정렬 알고리즘에는 다양한 알고리즘이 존재하며,

 

각 상황 마다 최적의 알고리즘이 존재하기에,

 

프로그래밍에 대해 공부하시는 분들은,

 

꼭 부디 다른 정렬 알고리즘 등을 공부해두면 좋을 것 같습니다.

 

 

제가 알기로는 퀵 정렬이 상당히 많이 사용되는 것으로 알고 있는데,

 

저 또한 퀵 정렬에 대해서 익숙해질 때 까지 공부하고 있습니다.

 

 

정렬 말고도, 검색 알고리즘 등, 마스터하는 그날까지 저 또한 열심히 공부하고 포스팅하겠습니다.

 

화이팅!!!!