• Home
  • About
    • KKsDev photo

      KKsDev

      게임 프로그래머를 목표로 Unity, C#을 공부하고 있습니다.

    • Learn More
    • Email
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

내일배움캠프 15일차 TIL

04 Aug 2023

Reading time ~3 minutes

오늘 공부한 내용

  1. Array.FindAll()
  2. Generic delegate Type, 람다식
  3. quickSort 구현 해보기
  4. str1 내부에 st2가 있는지 찾기

nbcbanner

Array.FindAll()

팀원들과 코드 테스트 문제를 풀면서

배열에서 특정 조건을 만족하는 요소의 개수를 세는 문제를 풀었다.


Array.FindAll() : 특정 조건을 만족하는 모든 요소를 찾아서 새로운 배열로 반환하는 메서드.

public static T[] FindAll<T>(T[] array, Predicate<T> match)

첫 번째 매개변수 : 대상이 될 배열,

두 번째 매개변수 : Predicate<T> 조건을 나타낼 delegate 또는 람다식

FindAll()은 두 번째 매개변수로 조건을 받아서 조건을 만족하는 배열의 모든 요소를

새 배열로 복사하여 반환한다, 반환된 배열은 원래 배열과 동일한 요소 순서를 유지한다.

만족하는 요소가 없다면 빈 배열이 반환된다.


Generic delegate Type, 람다식

delegate 형식중에서 Func<T,TResult>이나 Action은 전에 접해본 기억이 있는데

Predicate라는 형식은 처음봐서 Predicate 형식이 정확하게 어떤 형식인지 좀 더 공부해 보면서

Generic delegate Type에 대표적으로 어떤것들이 있는지 추가로 알아 봤다.



C#에서 제공하는 제네릭 델리게이트들의 특징

Func<T,TResult>, Action 다수의 인수를 받을수 있고, Predicate는 하나의 인수만을 받을 수 있었고,

Func<T,TResult>는 TResult 타입을 반환하고, ACtion은 값을 반환하지 않는다. 그리고 Predicate는 bool값을 반환한다.



람다식

람다식 (Lambda Expressions)는 간결하고 간단한 익명 함수를 만들 수 있도록 도와주는 기능이다.

코드를 더 가독성 있고 유연하게 만들 수 있다.

람다식은 익명 함수 이기 때문에 직접 호출할 수 없고, 이처럼 delegate가 람다식을 참조하여 람다식을 사용할 수 있다.

정리 :

C# delegate

quickSort 구현해보기

문제를 풀면서 Array.Sort() 메서드를 사용했는데 저번에 공부한 quickSort를 내가 구현할 수 있을지

잘 모르겠어서 시도해 보았는데 그냥 일반적인 quickSort는 구현할 수 있었는데

pivot을 지정하는 부분을 개선하려고 하니 잘 되지 않았다.

결국 처음 부터 다시 코드를 작성했는데 그전에 어떤 부분에서 실수가 있었는지 잘 알수가 없었다.

class Program
{ 
    static void Main()
    {
        
        int[] array = new int[20];
        Random random = new Random();

        for(int i =0; i< array.Length; i++)
        {
            array[i] = random.Next(30);
        }
        

        QuickSort(array, 0, array.Length-1);

        foreach(int i in array)
        {
            Console.Write($"{i} ");
        }
    }

    static void QuickSort(int[] array, int left, int right)
    {
        if (left >= right) return;

        int pivotIndex = Partition(array, left, right);

        QuickSort(array, left, pivotIndex - 1);
        QuickSort(array, pivotIndex + 1, right);
    }

    static int Partition(int[] array, int left, int right)
    {
        int i = left, j = right;

        int mid = (left + right) / 2;
        int pivot = array[mid];
        array[mid] = array[left];
        array[left] = pivot;

        while(i < j)
        {
            while (pivot < array[j]) j--;
            while (i < j && pivot >= array[i]) i++;

            int temp = array[j];
            array[j] = array[i];
            array[i] = temp;
        }

        array[left] = array[i];
        array[i] = pivot;

        return i;
    }

}

str1 내부에 st2가 있는지 찾기

문자열안에 문자열 문제를 팀원들과 리뷰하면서 생각도 못했던 방법을 알 수 있었다.

이 문제를 String.Split() 메서드를 통해서도 해결할 수 있었는데.

using System;

public class Solution {
    public int solution(string str1, string str2) 
    {
        // 풀이3
        return str1.Split(str2).Length > 1 ? 1 :2 ;

        /* 풀이1
        int str1Index = 0;
        int str2Index = 0;
        bool isContains = false;
        
        while(str1Index  < str1.Length)
        {
            if (str1[str1Index++] != str2[str2Index++])
            {
                str2Index = 0;
            }
            
            if (str2Index == str2.Length){
                isContains = true;
                break;
            }                     
        }
        
        return isContains ? 1 : 2;
        */
        
        /* 풀이 2
        return str1.Contains(str2) ? 1 : 2;;
        */
    }
}

str1.Split(str2).Length 를 하게 되면

Split() 메서드는 str1을 str2를 기준으로 나누어 문자열 배열로 반환하게 된다.

만약 str2가 하나 이상 있다면 문자열 배열의 크기는 1보다 크겠지만,

str2가 하나도 없다면 문자열 크기는 1일 것이기 때문에

str2가 있는지 없는지의 여부를 파악할 수 있었다.

nbcthumbnail



TIL내일배움캠프스파르타 Share Tweet +1