오늘 공부한 내용
- Array.FindAll()
- Generic delegate Type, 람다식
- quickSort 구현 해보기
- str1 내부에 st2가 있는지 찾기
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
Func<T,TResult>는 TResult 타입을 반환하고, ACtion
람다식
람다식 (Lambda Expressions)는 간결하고 간단한 익명 함수
를 만들 수 있도록 도와주는 기능이다.
코드를 더 가독성 있고 유연하게 만들 수 있다.
람다식은 익명 함수
이기 때문에 직접 호출할 수 없고, 이처럼 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가 있는지 없는지의 여부를 파악할 수 있었다.