본문 바로가기

Software Engineering/Computer Science

[C#] 네임드 튜플+정렬 알고리즘

 

목   차

     


    네임드 튜플

    퀘스트 저장 메커니즘을 임시로 int[,]의 정수형 이차원배열로 만들었는데 다른 사람들까지 알아보기 쉽게 만드려면 이 방법을 쓰라 하셔서 배워본다.

    정의

    네임드 튜플은 각 요소에 이름을 지정해서 데이터를 다룰 때 더 명확하고 이해하기 쉽게 한다. 배열로는 사용할 수 없고, List 같은 걸로 사용할 수 있다.

    사용방법

    List<(string Name, int Age)> people = new List<(string, int)>
    {
        ("John", 30),
        ("Mary", 25)
    };
    
    foreach (var person in people)
    {
        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
    }

    이런 식으로 네임드 튜플을 사용하면  " .(내가 만든 이름) " 으로 후에 불러올 수 있으니 확실히 가독성이 올라간다.

    본문내용넣기

    활용

    선언:

    List<(string QuestType, int QuestNumber, int CurrentProgress)> QuestSave;

     불러오기:

    // 첫 번째 요소의 QuestType을 가져옵니다.
    string type = QuestSave[0].QuestType;
    
    // 첫 번째 요소의 QuestNumber을 가져옵니다.
    int number = QuestSave[0].QuestNumber;
    
    // 첫 번째 요소의 CurrentProgress를 가져옵니다.
    int progress = QuestSave[0].CurrentProgress;

    수정하는 법:

    // 기존 튜플을 가져와서 일부 값만 변경
    var oldQuest = QuestSave[0];
    var newQuest = (oldQuest.QuestType, QuestNumber: 3, oldQuest.CurrentProgress);
    
    // 리스트에서 해당 요소를 새로운 튜플로 대체
    QuestSave[0] = newQuest;

     

    정렬 알고리즘

    오늘 본 배치고사에 정렬 알고리즘이 나왔는데 기억이 도통 안나 억지로 작동하게 만들어 제출했었다.

    병합정렬 시도하다가 기억이 잘 안나 그냥 제출한게 자존심 상해서 다시 공부한다.

    이곳의 정렬 시리즈 4개는 모두 C#문법종합반 강의 노션에 올라온 것을 기준으로 했다.

    내가 사용한 방법

    public static void Sort(int[] Array)
        {
            List<int> list = new List<int>();
    
            list.Add(Array[0]);
    
            for (int i = 1; i < Array.Length; i++)
            {
                int left = 0; int right = list.Count - 1;
    
                do
                {
                    if (Array[i] > list[left])
                    {
                        left++;
                    }
                    if (Array[i] < list[right])
                    {
                        right--;
                    }
    
                }while (left <= right);  
                
                list.Insert(left, Array[i]);
            }
    
            foreach (int i in list) 
                Console.Write(i + " ");
            Console.WriteLine();
        }

     정렬들의 차이가 정확히 뭔지 몰라 일단 삽입이라 생각하고 넘겼는데 곰곰이 생각해보니 삽입이 아니라 선택인거 같기도 하다... 혹은 둘 다 아닐수도 있고?

     

    이게 무슨 정렬이라 할 수 있는지 아시는 분은 댓글 바람!

    아무튼 정렬이 되기만 하면 되는거 아닌?가 라고 생각한다.

    선택 정렬

    int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
    
    for (int i = 0; i < arr.Length - 1; i++) //배열 모든 요소 정리될 때까지.
    {
        int minIndex = i; 
    
        for (int j = i + 1; j < arr.Length; j++)
        {
            if (arr[j] < arr[minIndex])
            {
                minIndex = j; //아직 정렬
            }
        }
    
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    
    foreach (int num in arr)
    {
        Console.WriteLine(num);
    }

    삽입 정렬

    int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
    
    for (int i = 1; i < arr.Length; i++)
    {
        int j = i - 1;
        int key = arr[i];
    
        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j--;
        }
    
        arr[j + 1] = key;
    }
    
    foreach (int num in arr)
    {
        Console.WriteLine(num);
    }

    퀵 정렬

    void QuickSort(int[] arr, int left, int right)
    {
        if (left < right)
        {
            int pivot = Partition(arr, left, right);
    
            QuickSort(arr, left, pivot - 1);
            QuickSort(arr, pivot + 1, right);
        }
    }
    
    int Partition(int[] arr, int left, int right)
    {
        int pivot = arr[right];
        int i = left - 1;
    
        for (int j = left; j < right; j++)
        {
            if (arr[j] < pivot)
            {
                i++;
                Swap(arr, i, j);
            }
        }
    
        Swap(arr, i + 1, right);
    
        return i + 1;
    }
    
    void Swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
    
    QuickSort(arr, 0, arr.Length - 1);
    
    foreach (int num in arr)
    {
        Console.WriteLine(num);
    }

    병합 정렬

    void MergeSort(int[] arr, int left, int right)
    {
        if (left < right)
        {
            int mid = (left + right) / 2;
    
            MergeSort(arr, left, mid);
            MergeSort(arr, mid + 1, right);
            Merge(arr, left, mid, right);
        }
    }
    
    void Merge(int[] arr, int left, int mid, int right)
    {
        int[] temp = new int[arr.Length];
    
        int i = left;
        int j = mid + 1;
        int k = left;
    
        while (i <= mid && j <= right)
        {
            if (arr[i] <= arr[j])
            {
                temp[k++] = arr[i++];
            }
            else
            {
                temp[k++] = arr[j++];
            }
        }
    
        while (i <= mid)
        {
            temp[k++] = arr[i++];
        }
    
        while (j <= right)
        {
            temp[k++] = arr[j++];
        }
    
        for (int l = left; l <= right; l++)
        {
            arr[l] = temp[l];
        }
    }
    
    int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
    
    MergeSort(arr, 0, arr.Length - 1);
    
    foreach (int num in arr)
    {
        Console.WriteLine(num);
    }