# data[].attributes.attachment_link.description
1번째부터 끝까지 훑어서 가장 작은 게 1번째, 2번째부터 끝까지 훑어서 가장 작은 게 2번째... 정렬이 끝날 때까지 반복한다. 이미 정렬되어 있는 자료구조에 삽입/제거 할 때나 배열이 작은 경우에는 매우 효율적이다.코드시간 복잡도Avg: O(n^2)Worst: O(

# data[].attributes.headline
버블정렬 : 가장 큰 숫자를 찾아 맨 뒤로 보내면서 정렬하는 것과 같습니다. 작은 숫자부터 차례대로 올바른 위치에 놓이게 됩니다.

# data[].attributes.subject
버블정렬 : 가장 큰 숫자를 찾아 맨 뒤로 보내면서 정렬하는 것과 같습니다. 작은 숫자부터 차례대로 올바른 위치에 놓이게 됩니다.

# data[].attributes.body
인접한 두 원소를 비교하여 필요에 따라 서로 위치를 교환하는 방식으로 동작합니다. 매번 한 단계씩 정렬하여 가장 큰(또는 작은) 원소가 맨 뒤(또는 맨 앞)으로 이동하는 방식입니다. 이 알고리즘의 시간 복잡도는 최선, 평균, 최악의 경우 모두 O(n^2)입니다.

# data[].attributes.headline
선택정렬:가장 작은 숫자를 선택해서 맨 앞으로 보내는 방식입니다. 작은 숫자들을 차례로 선택해 앞부터 정렬해나갑니다.

# data[].attributes.subject
선택정렬:가장 작은 숫자를 선택해서 맨 앞으로 보내는 방식입니다. 작은 숫자들을 차례로 선택해 앞부터 정렬해나갑니다.

# data[].attributes.body
배열에서 가장 작은(또는 큰) 원소를 선택하여 배열의 맨 앞부터 순서대로 정렬해 나가는 방식입니다. 정렬되지 않은 부분에서 최소(또는 최대) 원소를 선택하여 해당 위치에 삽입합니다. 선택 정렬의 시간 복잡도는 항상 O(n^2)입니다.

# data[].attributes.headline
삽입정렬:카드를 손에 든 상태로 숫자가 작은 카드부터 정렬된 위치에 삽입하는 방식입니다. 숫자가 큰 카드부터 차례로 손에 들고 올바른 위치에 삽입합니다.

# data[].attributes.subject
삽입정렬:카드를 손에 든 상태로 숫자가 작은 카드부터 정렬된 위치에 삽입하는 방식입니다. 숫자가 큰 카드부터 차례로 손에 들고 올바른 위치에 삽입합니다.

# data[].attributes.body
7배열을 정렬된 부분과 정렬되지 않은 부분으로 나눈 후, 정렬되지 않은 부분의 원소를 정렬된 부분에 삽입하면서 정렬해 나가는 방식입니다. 삽입 정렬의 시간 복잡도는 평균적으로 O(n^2)이며, 최선의 경우(거의 정렬되어 있는 상태)에는 O(n)의 시간 복잡도를 가집니다

# data[].attributes.headline
합병 정렬 (Merge Sort):숫자들을 작은 단위로 쪼개고, 그것들을 정렬한 다음 크기순으로 합쳐나가는 방법입니다. 반으로 나누고 합치면서 정렬합니다.

# data[].attributes.subject
합병 정렬 (Merge Sort):숫자들을 작은 단위로 쪼개고, 그것들을 정렬한 다음 크기순으로 합쳐나가는 방법입니다. 반으로 나누고 합치면서 정렬합니다.

# data[].attributes.body
분할 정복 알고리즘의 일종으로, 배열을 반으로 나눈 후 나눠진 부분을 정렬하고 합병하여 전체를 정렬하는 방식입니다. 합병 정렬은 일반적으로 안정적이며, 시간 복잡도는 항상 O(n log n)입니다.

# data[].attributes.headline
퀵 정렬 (Quick Sort): 하나의 숫자를 선택해 그 숫자보다 작은 숫자는 왼쪽으로, 큰 숫자는 오른쪽으로 옮겨가며 정렬합니다. 계속해서 더 작은 단위로 나누어 정렬합니다.

# data[].attributes.subject
퀵 정렬 (Quick Sort): 하나의 숫자를 선택해 그 숫자보다 작은 숫자는 왼쪽으로, 큰 숫자는 오른쪽으로 옮겨가며 정렬합니다. 계속해서 더 작은 단위로 나누어 정렬합니다.

# data[].attributes.body
분할 정복 알고리즘을 사용하여 구현된 정렬 알고리즘으로, 피벗을 기준으로 작은 값은 왼쪽으로, 큰 값은 오른쪽으로 분할하여 정렬하는 방식입니다. 평균적으로 O(n log n)의 시간 복잡도를 가지지만, 최악의 경우에는 O(n^2)의 시간 복잡도를 갖을 수 있습니다.

# data[].attributes.headline
힙 정렬 (Heap Sort): 힙이라는 구조를 사용하여 큰 숫자나 작은 숫자를 빠르게 찾아 정렬하는 방법입니다. 힙은 부모 노드가 자식 노드보다 항상 크거나 작은 값을 갖는 트리 구조입니다.

# data[].attributes.subject
힙 정렬 (Heap Sort): 힙이라는 구조를 사용하여 큰 숫자나 작은 숫자를 빠르게 찾아 정렬하는 방법입니다. 힙은 부모 노드가 자식 노드보다 항상 크거나 작은 값을 갖는 트리 구조입니다.

# data[].attributes.body
힙 자료구조를 활용하여 정렬을 수행하는 알고리즘으로, 완전 이진 트리 구조인 힙에서 최대 힙 또는 최소 힙을 구성하여 정렬하는 방식입니다. 시간 복잡도는 항상 O(n log n)입니다.

# data[].attributes.body
양쪽에 거울이 있을 때 거울에 비친 자신이 무한 반복해서 비치는 것 또는 마트료시카 인형처럼 동일한 작동을 무한적으로 반복하는 알고리즘을 말함

# data[].attributes.body
재귀 호출(Recursion)은 자신을 다시 호출하는 것 ▪ 마지막 종이 상자가 나올 때까지 여러 개 겹쳐진 상자를 꺼내 마지막 상자에 반지 넣는 예 또는 꺼낸 순서와 반대로 종이 상자를 다시 넣는 예

# data[].attributes.body
상자를 반복해서 여는 과정을 재귀 호출 형태로 표현

# data[].attributes.headline
일반적인 프로그램에서는 무한 반복을 마치고 되돌아가는 조건을 함께 사용함

# data[].attributes.subject
일반적인 프로그램에서는 무한 반복을 마치고 되돌아가는 조건을 함께 사용함

# data[].attributes.body
▪ 10회 반복 후 호출한 곳으로 다시 돌아가는 조건을 사용하는 예

# data[].attributes.body
포화 이진 트리는 모든 노드가 완전히 채워진 이진 트리입니다. 이진 트리란 각 노드가 최대 두 개의 자식 노드를 갖는 트리 구조를 말합니다. 여기서 '포화'란 모든 레벨이 꽉 채워진 상태를 의미합니다.

완전 이진 트리는 포화 이진 트리와 비슷하지만, 마지막 레벨을 제외한 모든 레벨이 완전히 채워진 이진 트리입니다. 여기서 '완전'이란 노드가 왼쪽부터 오른쪽으로 순서대로 채워져 있는 상태를 의미합니다.

왼쪽 편향 이진 트리(Left-skewed Binary Tree)는 모든 노드가 오른쪽 자식을 가지지 않고 왼쪽 자식만을 가리키는 특별한 종류의 이진 트리입니다. 이 트리의 모양은 왼쪽으로 향하는 경사 모양을 가지고 있어 왼쪽으로만 뻗어 나가는 구조를 보입니다.

오른쪽 편향 이진 트리(Right-skewed Binary Tree)는 각 노드가 왼쪽 자식을 가지지 않고 오른쪽 자식만을 가리키는 특별한 종류의 이진 트리입니다. 이 트리의 모양은 오른쪽으로만 뻗어나가는 구조를 보이며, 왼쪽에 노드가 없는 경사 모양을 가지고 있습니다.

# data[].attributes.body
▪ 회사 사장을 필두로 그 아래 직책들이 구성되어 있는 조직표 또는 컴퓨터의 상위 폴더 안에 하위 폴더들이 계속 이어져 있는 구조와 같은 구성

# data[].attributes.body
1. 루트 노드 (Root Node): 트리 구조에서 최상위에 위치한 노드로, 다른 모든 노드는 이 루트 노드에서 시작하는 경로로 연결됩니다.

2. 부모 노드 (Parent Node): 어떤 노드의 바로 위에 연결된 노드를 말합니다. 모든 노드는 부모 노드를 가질 수 있습니다.

3. 자식 노드 (Child Node): 어떤 노드로부터 나온 노드들을 말합니다. 각 노드는 여러 개의 자식 노드를 가질 수 있습니다.

4. 잎 노드 (Leaf Node 또는 Terminal Node): 자식 노드가 없는 노드로, 트리의 맨 끝에 위치한 노드를 말합니다.

5. 서브 트리 (Subtree): 전체 트리 안에 속하는 다른 트리를 말합니다. 부모 노드와 그 자식 노드들로 이루어진 하위 트리를 의미합니다.

6. 깊이 (Depth): 루트 노드부터 특정 노드까지의 경로의 길이를 나타냅니다. 루트 노드의 깊이는 0이며, 하위 레벨로 갈수록 깊이가 1씩 증가합니다.

7. 높이 (Height): 트리의 최대 깊이를 말하며, 가장 깊은 잎 노드까지의 깊이입니다.

8. 이진 트리 (Binary Tree): 각 노드가 최대 두 개의 자식 노드를 가지는 트리입니다.

9. 루트 (Root): 트리 구조에서 최상위에 위치한 노드를 말합니다. 이 노드는 다른 모든 노드들을 연결하는 시작점 역할을 합니다. 모든 경로는 루트 노드에서부터 시작합니다.

10. 에지 (Edge): 노드들 간의 연결선을 의미합니다. 트리 구조에서 노드는 에지로 연결되어 있으며, 이 에지를 통해 부모 노드와 그의 자식 노드들이 서로 연결됩니다. 각 노드는 하나의 부모 노드와 여러 개의 자식 노드들과 에지로 연결됩니다.

# data[].attributes.body
이진 트리는 각 노드가 최대 두 개의 자식 노드를 가지는 트리 구조입니다. 각 노드는 세 가지 주요 구성 요소로 이루어져 있습니다.

1. 데이터 필드(Data Field): 노드가 저장하는 실제 데이터를 말합니다. 이것은 트리의 각 노드에서 관리하고 있는 정보입니다. 예를 들어, 정수, 문자열 또는 다른 형태의 데이터가 될 수 있습니다.

2. 왼쪽 자식 노드(Left Child Node)와 오른쪽 자식 노드(Right Child Node): 각 노드는 최대 두 개의 자식을 가질 수 있습니다. 왼쪽 자식 노드와 오른쪽 자식 노드는 해당 노드보다 낮은 값(작은 값)을 갖는 노드가 왼쪽에 위치하고, 더 높은 값(큰 값)을 갖는 노드가 오른쪽에 위치하도록 구성될 수 있습니다. 그러나 이진 트리의 구조는 정렬되어 있지 않아도 됩니다.

3. 링크 필드(Link Field): 각 노드는 왼쪽 자식 노드와 오른쪽 자식 노드를 가리키는 링크(포인터)를 갖습니다. 이 링크는 해당 노드의 자식 노드를 가리키며, 이를 통해 트리의 구조가 형성됩니다.

이진 트리에서 맨 위에 있는 노드는 루트 노드(Root Node)라고 하며, 이 노드에서부터 시작하여 각 노드의 자식 노드로 이어지는 구조가 형성됩니다. 이진 트리는 매우 유연한 구조이며, 데이터를 효율적으로 저장하고 검색하는 데 사용됩니다

# data[].attributes.body
기차가 터널에 들어가는 순서대로 터널을 빠져나오고, ATM기에서 줄을 선 순서대로 예금을 인출하는 것처럼 큐는 먼저 들어간 것이 먼저 나오는 구조를 의미

# data[].attributes.body
큐(Queue) 자료구조는 입구와 출구가 따로 있는 원통 형태

# data[].attributes.body
구조와 용어 ▪ 큐에 데이터를 삽입하는 작동 : enQueue(인큐) ▪ 데이터를 추출하는 작동 : deQueue(데큐) ▪ 저장된 데이터 중 첫 번째 데이터 : front(머리) ▪ 저장된 데이터 중 마지막 데이터 : rear(꼬리)

# data[].attributes.body
아이스크림 콘에 여러 가지 맛을 쌓을 때, 가장 먼저 넣은 맛을 가장 나중에 먹을 수 있는 구조

스택 First In Last Out, FILO 구조로 입구가 하나이니 때문에 먼저 들어간 것이

가장 나중엔 나오는 구조

# data[].attributes.body
스택 기본 구조

▪ 스택에 데이터를 삽입하는 작동 : push

▪ 스택에 데이터를 추출하는 작동 : pop

▪ 스택에 들어 있는 가장 위의 데이터 : top

# data[].attributes.body
시작 위치와 다음 위치가 계속 이어진 후 마지막에 다시 시작으로 돌아오는 형태

# data[].attributes.headline
원형 연결 리스트의 개념

# data[].attributes.subject
원형 연결 리스트의 개념

# data[].attributes.body
▪ 단순 연결 리스트와 구조와 구현 코드가 상당히 유사

▪ 리스트 형태가 원(Circle) 형태로 구성(계속 회전하면서 연속 가능)

▪ 오버헤드가 발생하지 않음

오버헤드(Overhead)란 주어진 작업을 수행하기 위해 필요한 추가적인 비용이나 부가적인 처리량을 나타냅니다.

이는 주로 시스템, 프로세스, 프로그램 등에서 추가로 발생하는 비용을 가리키며, 작업을 완료하는 데 필요한 리소스나 시간을 늘리는 요소를 의미합니다.

간단한 예시로 설명하자면, 어떤 프로그램에서 데이터를 저장할 때 메모리를 할당하는 것을 생각해볼 수 있습니다. 만약 프로그램이 메모리에 데이터를 저장하는데, 실제 필요한 데이터보다 더 많은 메모리를 사용한다면, 이 추가적으로 사용된 메모리 공간은 오버헤드가 될 수 있습니다. 이는 실제로 필요한 양보다 더 많은 자원을 소모하는 것으로 이해할 수 있습니다.

# data[].attributes.body
1. 단순 연결 리스트의 구조: 단순 연결 리스트는 각 노드가 데이터와 다음 노드를 가리키는 포인터(주소)로 이루어집니다. 각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어져 있습니다. 이때, 맨 앞의 노드를 헤드(head) 노드라고 합니다.

2. 맨 앞의 데이터 삭제 과정:

헤드 노드를 가리키는 포인터를 사용하여 첫 번째 노드를 찾습니다.

헤드 노드의 다음 노드(두 번째 노드)를 새로운 헤드 노드로 설정합니다.

첫 번째 노드를 삭제하고 해당 노드의 메모리를 해제합니다.

간단한 예시를 통해 설명하면, 다음과 같이 진행될 수 있습니다:

예를 들어, 1 → 2 → 3 → 4의 순서로 노드가 연결된 단순 연결 리스트가 있다고 가정합니다. 여기서 맨 앞의 데이터인 1을 삭제하는 과정은 아래와 같습니다.

1. 현재 헤드 노드는 1을 가리키고 있습니다.

2. 헤드 노드의 다음 노드를 새로운 헤드 노드로 설정합니다. (2를 가리키게 합니다)

3. 첫 번째 노드(1)를 삭제하고, 해당 노드의 메모리를 해제합니다.

이제 단순 연결 리스트의 새로운 헤드 노드는 2이며, 연결 리스트는 2 → 3 → 4로 업데이트됩니다. 이 과정을 통해 맨 앞의 데이터를 삭제하는 동작이 이루어집니다.

# data[].attributes.body
1. 구조:

선형 리스트: 배열 형태로 데이터를 저장하는 자료구조로, 연속된 메모리 공간에 데이터가 저장됩니다. 각 요소는 인덱스를 사용하여 접근할 수 있습니다.

단순 연결 리스트: 노드들이 포인터를 사용하여 연결된 구조를 갖습니다. 각 노드는 데이터 필드와 다음 노드를 가리키는 포인터(링크)로 구성됩니다.

2. 메모리 할당:

선형 리스트: 정적으로 크기를 정해놓고 메모리에 할당하여 사용합니다. 크기가 고정되어 있어 중간에 크기를 변경하기 어려울 수 있습니다.

단순 연결 리스트: 동적으로 메모리를 할당하며, 필요에 따라 노드를 추가하거나 삭제할 수 있습니다. 크기가 유연하게 조절 가능합니다.

3. 삽입과 삭제 연산:

선형 리스트: 배열에서 데이터를 삽입하거나 삭제할 때, 해당 위치의 요소를 이동시켜야 할 수 있습니다. 중간에 데이터를 추가하거나 삭제할 경우 비용이 크게 들 수 있습니다.

단순 연결 리스트: 노드를 추가하거나 삭제할 때에는 해당 위치의 노드를 연결 구조를 변경하여 처리하므로, 요소의 이동이 필요하지 않습니다. 따라서 삽입 및 삭제 연산이 비교적 빠릅니다.

4. 접근 속도:

선형 리스트: 인덱스를 이용하여 직접 요소에 접근하기 때문에 요소에 빠르게 접근할 수 있습니다.

단순 연결 리스트: 특정 요소에 접근하기 위해서는 처음부터 순회하며 찾아야 합니다. 따라서 특정 인덱스의 요소에 접근하는 데에는 더 많은 시간이 소요될 수 있습니다.

5. 메모리 사용량:

선형 리스트: 요소가 연속된 메모리 공간에 저장되므로, 메모리 사용 측면에서 연속적인 공간을 필요로 합니다.

단순 연결 리스트: 각 노드는 데이터와 포인터만을 저장하므로, 메모리의 불연속적인 공간을 사용합니다. 추가적인 메모리가 포인터를 위해 사용될 수 있습니다.

# data[].attributes.body
선형리스트:

-맛집이나 마트에서 줄을 서는 것처럼 데이터를 일정한 순서로

나열하는 것

-데이터를 일정한 순서로 나열한 자료구조. Ordered List.

-입력 순서대로 저장하는 데이터에 적당

단순연결리스트:

- 방문할 맛집을 지도에 순서대로 연결한 것,

떨어진 곳에 위치한

데이터를 화살표로 연결

- 노드들이 물리적으로 떨어진 곳에 위치. 노드는 순차적이지 않음.

-화살표로 표시된 링크를 따라가면 선형리스트 순서와 같음

<비교> 데이터 삽입/삭제시

-선형리스트: 오버헤드 발생(많은 작업 요함)

-단순연결리스트: 오버헤드 발생 없음 (앞뒤 링크만 수정)

# data[].attributes.headline
단순 연결 리스트의 원리

# data[].attributes.subject
단순 연결 리스트의 원리

# data[].attributes.body
1. 데이터 저장 영역:

이 영역에는 노드가 저장하는 실제 데이터가 들어갑니다. 이 데이터는 리스트에서 각 노드가 가지고 있는 정보를 나타냅니다. 예를 들어, 숫자, 문자열, 객체 등을 저장할 수 있습니다.

2. 포인터(주소) 영역:

포인터는 다음 노드를 가리키는 정보를 담고 있습니다. 이 포인터는 메모리 주소나 다음 노드의 참조를 나타냅니다.

단순 연결 리스트에서 각 노드는 다음 노드를 가리키는 포인터를 포함하고 있으며, 이를 통해 각 노드들이 한 방향으로 연결되어 있습니다.

# data[].attributes.body
자료구조: 컴퓨터 분야에서 효율적으로 접근하고 수정할 수 있도록

자료를 구성,관리,저장하는 것

알고리즘: 컴퓨터 분야나 수학 등 관련 분야에서 어떤 문제를 해결하기 위해 정해진 일련의 단계적인 절차