C# 알고리즘 10

OrderBy

OrderBy LINQ에서 추출된 데이터를 오름차순으로 정렬하는 메서드 데이터를 변경하는 것이 아니라 데이터의 순서만 변경 public class Student { public string name; public int score; public int spendTime; } public static void Main() { List students = new() { new () { name = "Kelly", score = 50, spendTime = 30 }, new () { name = "Brown", score = 70, spendTime = 20 }, new () { name = "James", score = 20, spendTime = 80 }, new () { name = "Cathy", sc..

C# 알고리즘 2023.11.29

LinkedList (링크드리스트)

링크드리스트 - 고정되지 않은 공간을 가지고 있고, 각각의 원소들이 연속되지 않는 메모리 공간을 할당 - 각 노드가 데이터와 포인터를 가지고 있으면서 노드들이 한 줄로 쭉 연결되어 있는 방식 - 유동적으로 연결고리를 떼었다가 붙였다가 할 수 있음 - 양방향으로도 연결 가능 - 노드 : 각각의 원소 값 저장 - 포인터 : 현재 노드가 가리키는 다음 노드 - C++의 List와 유사 링크드리스트와 배열 비교 배열 링크드리스트 조회 index로 직접 접근, 시간 복잡도 : O(1) 모든 요소 조회, 시간 복잡도 : O(n) 중간 삽입 및 삭제 모든 요소 이동, 시간 복잡도 : O(n) 시간 복잡도 : O(1) 또는 O(n) 공간 크기가 고정 유동적으로 변함 메모리 공간 연속적 비연속적 장점 빠른 조회 중간 삽..

C# 알고리즘 2023.11.16

Big-O 표기법

Big-O 표기법 - 알고리즘의 효율성을 나타내는 표기법 - 입력의 크기에 따라 알고리즘이 얼마나 많은 시간이나 공간을 필요로 하는지 설명 - Big-O 표기법은 알고리즘의 최악의 경우 성능을 나타냄 예시 - O(1) : 상수 시간, 입력의 크기에 상관 없이 항상 일정한 시간이 걸림 - O(n) : 선형 시간, 입력의 크기에 비례하여 시간이 걸림 - O(n^2) : 이차 시간, 입력의 크기의 제곱에 비례하여 시간이 걸림 - O(log n) : 로그 시간, 입력의 크기의 로그에 비례하여 시간이 걸림 계산방법 1. 상수 버리기 : 상수 항목이나 낮은 차수의 항목은 중요하지 않으므로 버림 ex) O(2n) -> O(n), O(3n^2) -> O(n^2) 2. 최고 차수 항목만 남기기 : 가장 빠르게 증가하는 ..

C# 알고리즘 2023.11.15

그리디 알고리즘

● 그리디 알고리즘 - 각 단계에서 가장 최적인 선택을 하는 알고리즘 - 각 단계의 최적인 선택이 최종적으로 최적인 선택이 아닐수도 있음 // 문제: 주어진 동전들로 특정 금액을 만드는데 필요한 최소 동전 수를 구하는 함수를 작성하세요. public int MinCoins(int[] coins, int amount) { Array.Sort(coins); int count = 0; for(int i = coins.Length - 1; i >= 0; i--) { while(amount >= coins[i]) { amount -= coins[i]; count++; } } if(amount > 0) return -1; return count; } // 시간 복잡도는 O(n) // 공간 복잡도는 O(1)

C# 알고리즘 2023.11.15

트리 (Tree)

● 트리 - 계층적인 자료를 표현하는 대표적인 자료구조 - 검색 알고리즘을 위해 주로 사용 - 가장 위에 하나의 루트(Root)로부터 출발하여 그 밑에 0개 이상의 여러 자식 노드들을 가지는 구조 - 하나의 자식은 하나의 부모만 가질 수 있음 - ex) 회사 조직도 ● 트리와 그래프 비교 그래프 트리 방향성 방향, 무방향 둘다 존재 방향 있음 사이클 가능 불가능 루트 없음 있음 부모 / 자식 관계 없음 있음

C# 알고리즘 2023.11.15

그래프 (Graph)

● 그래프 - 정점 (Vertex)과 간선 (Edge)으로 이루어진 자료 구조 - 방향 그래프와 무방향 그래프로 나뉨 - 가중치 그래프는 간선에 가중치가 있음 ● 그래프 탐색 방법 1. 길이 우선 탐색 (Depth-First Search, DFS) - 트리나 그래프를 탐색하는 알고리즘 중 하나로, 루트에서 시작하여 가능한 한 깊이 들어가서 노드를 탐색하고, 더 이상 방문할 노드가 없으면 이전 노드로 돌아가는 방식 - 시간 복잡도 : 최악의 경우 O(V + E) (V는 노드 수, E는 간선 수) 2. 너비 우선 탐색 (Breadth-First Search, BFS) - 트리나 그래프를 탐색하는 알고리즘 중 하나로, 루트에서 시작하여 가까운 노드부터 방문하고, 그 다음 레벨의 노드를 방문하는 방식 - 시간 ..

C# 알고리즘 2023.11.15

탐색 알고리즘

● 탐색 알고리즘 - 데이터 집합에서 특정 항목을 찾는 방법을 제공 1. 선형 탐색 - 가장 단순한 탐색 알고리즘 - 배열의 각 요소를 하나씩 차례대로 검사 - 배열이 정렬되어 있지 않는 경우에 사용 - 시간 복잡도 : 최악의 경우 O(n) int SequentialSearch(int[] arr, int target) { for (int i = 0; i < arr.Length; i++) { if (arr[i] == target) { return i; } } return -1; } 2. 이진 탐색 - 정렬이된 배열에서 빠르게 원하는 항목을 찾는 방법 - 중간 요소와 찾고자하는 항목을 비교하여 대상이 중간 요소보다 작으면 왼쪽, 크면 오른쪽 탐색 - 중앙값과 비교하여 탐색 범위를 반으로 줄이는 방법으로 빠른..

C# 알고리즘 2023.11.15

정렬 알고리즘

● 정렬 알고리즘 - 주어진 데이터 세트를 특정 순서로 배열하는 방법을 제공 1. 선택 정렬 - 배열에서 최소값 또는 최대값을 찾아 맨 앞 또는 맨 뒤와 교환하는 방법 - 시간 복잡도 : O(n^2) - 공간 복잡도 : O(1) / 추가 공간이 필요하지 않음 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] ..

C# 알고리즘 2023.11.15