정보처리기사 - 데이터 입출력 구현 #61~63
2023. 8. 19. 11:38ㆍ자격증/정보처리기사
61. 트리(Tree)
61.1 트리(Tree)
정점(Node, 노드)과 선분(Branch, 가지)을 이용하여 사이클을 이루지 않도록 구성한 그래프(Graph)의 특수한 형태
- 트리는 하나의 기억 공간을 노드(Node)라고 하며, 노드와 노드를 연결하는 선을 링크(Link)라고 함
61.2 트리 관련 용어
- 노드(Node) : 트리의 기본 요소로서 자료 항목과 다른 항목에 대한 가지(Branch)를 합친 것
- 예) A, B, C, D, E, F, G, H, I, J, K ,L ,M
- 근 노드(Root Node) : 트리의 맨 위에 있는 노드
- 예) A
- 디그리(Degree, 차수) : 각 노드에서 뻗어나온 가지의 수
- 예) A=3, B=2, C=1, D=3
- 단말 노드(Terminal Node) = 잎 노드(Leaf Node) : 자식이 하나도 없는 노드, 즉 Degree가 0인 노드
- 예) K, L, F, G, M, I, J
- 비단말 노드(Non-Terminal Node) : 자식이 하나라도 있는 노드, 즉 Degree가 0이 아닌 노드
- 예) A, B, C, D, E, H
- 조상 노드(Ancestors Node) : 임의의 노드에서 근 노드에 이르는 경로상에 있는 노드들
- 예) M의 조상 노드는 H, D, A
- 자식 노드(Son Node) : 어떤 노드에 연결된 다음 레벨의 노드들
- 예) D의 자식 노드는 H, I, J
- 부모 노드(Parent Node) : 어떤 노드에 연결된 이전 레벨의 노드들
- 예) E, F의 부모 노드는 B
- 형제 노드(Brother Node, Sibling) : 동일한 부모를 갖는 노드들
- 예) H의 형제 노드는 I, J
- Level : 근 노드의 Level을 1로 가정한 후 어떤 Level이 L이면 자식 노드는 L+1
- 예) H의 레벨은 3
- 깊이(Depth, Height) : Tree에서 노드가 가질 수 있는 최대 레벨
- 예) 위 트리의 깊이는 4
- 숲(Forest) : 여러 개의 트리가 모여 있는 것
- 예) 위 트리에서 근 노드 A를 제거하면 B, C, D를 근 노드로 하는 세 개의 트리가 있는 숲이 생성
- 트리의 디그리 : 노드들의 Degree 중에서 가장 많은 수
- 예) 노드 A나 D가 세 개의 Degree를 가지므로 위 트리의 Degree는 3
62. 이진 트리(Tree)
62.1 이진 트리(Tree)
차수(Degree)가 2 이하인 노드들로 구성된 트리, 즉 자식이 둘 이하인 노드들로만 구성된 트리
- 이진 트리의 레벨i에서 최대 노드의 수는 2i-1
- 이진 트리에서 Terminal Node의 수가 n0, 차수가 2인 노드 수가 n2라고 할 때 n0 = n2+1이 됨
- 예) 레벨 3에서 최대 노드의 개수는 23-1 = 4
- Terminal Node의 개수가 4개이고, 차수가 2인 노드가 3개이므로 4 = 3+1에 의해 n0 = n2+1이 성립됨
62.2 트리의 운행법(Traversal)
트리를 구성하는 각 노드들을 찾아가는 방법
- 이진 트리를 운행하는 방법은 산술식의 표기법과 연관성을 가짐
- 이진 트리의 운행법은 다음 세 가지가 존재
- Preorder 운행 : Root→Left→Right 순으로 운행 (A, B, C)
- 루트가 앞(Pre)에 위치
- Inorder 운행 : Left→Root→Right 순으로 운행 (B, A, C)
- 루트가 안(In)에 위치
- Postorder 운행 : Left→Right→Root 순으로 운행 (B, C, A)
- 루트가 뒤(Post)에 위치
62.3 Preorder 운행법
이진 트리를 Root→Left→Right 순으로 운행하며 노드들을 찾아가는 방법
- Preorder 운행법의 방문 순서
- 서브트리를 하나의 노드로 생각할 수 있도록 그림과 같이 서브트리 단위로 묶음
- Preorder는 Root→Left→Right이므로 A, 1, 3이 됨
- 1은 B, 2, E이므로 A, B, 2, E, 3이 됨
- 2는 D, H, I이므로 A, B, D, H, I, E, 3이 됨
- 3은 C, F, G이므로 A, B, D, H, I, E, C, F, G가 됨
- 방문 순서 : A, B, D, H, I, E, C, F, G
62.4 Inorder 운행법
이진 트리를 Left→Root→Right 순으로 운행하며 노드들을 찾아가는 방법
- Inorder 운행법의 방문 순서
- Inorder는 Left→Root→Right이므로 1, A, 3이 됨
- 1은 2, B, E이므로 2, B, E, A, 3이 됨
- 2는 H, D, I이므로 H, D, I, B, E, A, 3이 됨
- 3은 F, C, G이므로 H, D, I, B, E, A, F, C, G가 됨
- 방문 순서 : H, D, I, B, E, A, F, C, G
62.5 Postorder 운행법
이진 트리를 Left→Right→Root 순으로 운행하며 노드들을 찾아가는 방법
- Postorder 운행법의 방문 순서
- Inorder는 Left→Right→Root이므로 1, 3, A가 됨
- 1은 2, E, B이므로 2, E, B, 3, A가 됨
- 2는 H, I, D이므로 H, I, D, E, B, 3, A가 됨
- 3은 F, G, C이므로 H, I, D, E, B, F, G, C, A가 됨
- 방문 순서 : H, I, D, E, B, F, G, C, A
62.6 수식의 표기법
이진 트리로 만들어진 수식을 Preorder, Inorder, Postorder로 운행하면 각각 전위(Prefix), 중위(Infix), 후위(Postfix) 표기법이 됨
- 전위 표기법(Prefix) : 연산자→Left→Right (+, A, B)
- 중위 표기법(Infix) : Left→연산자→Right (A, +, B)
- 후위 표기법(Postfix) : Left→Right→연산자 (A, B, +)
62.6.1 Infix 표기를 Postfix나 Prefix로 바꾸기
Postfix나 Prefix는 스택을 이용하여 처리하므로 Infix는 Postfix나 Prefix로 바꾸어 처리
- 예제 : 다음과 같이 Infix로 표기된 수식을 Prefix와 Postfix로 변환하라
- Prefix로 변환하기
- 연산 우선순위에 따라 괄호로 묶음
- 연산자를 해당 괄호의 앞(왼쪽)으로 옮김
- 필요 없는 괄호를 제거
- Postfix로 변환하기
- 연산 우선순위에 따라 괄호로 묶음
- 연산자를 해당 괄호의 뒤(오른쪽)으로 옮김
- 필요 없는 괄호를 제거
62.6.2 Postfix나 Prefix로 표기된 수식을 Infix로 바꾸기
- 예제 : 다음과 같이 Postfix로 표기된 수식을 Infix로 변환하라
- Postfix는 Infix 표기법에서 연산자를 해당 피연산자 두 개의 뒤로 이동한 것이므로 연산자를 다시 해당 피연산자 두 개의 가운데로 옮기면 됨
- 인접한 피연산자 두 개와 오른쪽의 연산자를 괄호로 묶음
- 연산자를 해당 피연산자의 가운데로 이동
- 필요 없는 괄호를 제거
- 예제 : 다음과 같이 Prefix로 표기된 수식을 Infix로 변환하라
- Prefix는 Infix 표기법에서 연산자를 해당 피연산자 두 개의 앞으로 이동한 것이므로 연산자를 다시 해당 피연산자 두 개의 가운데로 옮기면 됨
- 인접한 피연산자 두 개와 왼쪽의 연산자를 괄호로 묶음
- 연산자를 해당 피연산자 사이로 이동
- 필요 없는 괄호를 제거
63. 정렬(Sort)
63.1 삽입 정렬(Insertion Sort)
가장 간단한 정렬 방식으로, 이미 순서화된 파일에 새로운 하나의 레코드를 순서에 맞게 삽입시켜 정렬하는 방식
- 평균/최악 수행 시간 복잡도 : O(n2)
- 예제 : 8, 5, 6, 2, 4를 삽입 정렬로 정렬하라
- 초기 상태
- 1회전 : 두 번째 값을 첫 번째 값과 비교하여 5를 첫 번째 자리에 삽입하고 8을 한 칸 뒤로 이동
- 2회전 : 세 번째 값을 첫 번째, 두 번째 값과 비교하여 6을 8 자리에 삽입하고 8은 한칸 뒤로 이동
- 3회전 : 네 번째 값 2를 처음부터 비교하여 맨 처음에 삽입하고 나머지를 한 칸씩 뒤로 이동
- 4회전 : 다섯 번째 값 4를 처음부터 비교하여 5 자리에 삽입하고 나머지를 한 칸씩 뒤로 이동
63.2 선택 정렬(Selection Sort)
n개의 레코드 중에서 최소값을 찾아 첫 번째 레코드 위치에 놓고, 나머지 (n-1)개 중에서 다시 최소값을 찾아 두 번째 레코드 위치에 놓는 방식을 반복하여 정렬하는 방식
- 평균/최악 수행 시간 복잡도 : O(n2)
- 예제 : 8, 5, 6, 2, 4를 선택 정렬로 정렬하라
- 초기 상태
- 1회전
- 2회전
- 3회전
- 4회전
63.3 버블 정렬(Bubble Sort)
주어진 파일에서 인접한 두 개의 레코드 키 값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 정렬 방식
- 평균/최악 수행 시간 복잡도 : O(n2)
- 예제 : 8, 5, 6, 2, 4를 버블 정렬로 정렬하라
- 초기 상태
- 1회전
- 2회전
- 3회전
- 4회전
63.4 쉘 정렬(Shell Sort)
입력 파일을 어떤 매개변수의 값으로 서브파일을 구성하고, 각 서브파일을 삽입 정렬 방식으로 순서 배열하는 과정을 반복하는 정렬 방식
- 삽입 정렬(Insertion Sort)을 확장한 개념
- 평균 수행 시간 복잡도 : O(n1.5)
- 최악 수행 시간 복잡도 : O(n2)
63.5 퀵 정렬(Quick Sort)
키를 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽 서브 파일에 분해시키는 과정을 반복하는 정렬 방식
- 레코드의 많은 자료 이동을 없애고 하나의 파일을 부분적으로 나누어 가면서 정렬
- 평균 수행 시간 복잡도 : O(nlog2n)
- 최악 수행 시간 복잡도 : O(n2)
63.6 힙 정렬(Heap Sort)
전이진 트리를 이용한 정렬 방식
- 구성된 전이진 트리(Complete Binary Tree)를 Heap Tree로 변환하여 정렬
- 평균/최악 수행 시간 복잡도 : O(nlog2n)
63.7 2-Way 합병 정렬(Merge Sort)
이미 정렬되어 있는 두 개의 파일을 한 개의 파일로 합병하는 정렬 방식
- 평균/최악 수행 시간 복잡도 : O(nlog2n)
63.8 기수 정렬(Radix Sort) = Bucket Sort
Queue를 이용하여 자릿수(Digit)별로 정렬하는 방식
- 레코드의 키 값을 분석하여 같은 수 또는 같은 문자끼리 그 순서에 맞는 버킷에 분배하였다가 버킷의 순서대로 레코드를 꺼내어 정렬
- 평균/최악 수행 시간 복잡도 : O(dn)
'자격증 > 정보처리기사' 카테고리의 다른 글
정보처리기사 - 서버 프로그램 구현 #70~72 (0) | 2023.08.19 |
---|---|
정보처리기사 - 통합 구현 #64~69 (0) | 2023.08.19 |
정보처리기사 - 데이터 입출력 구현 #58~60 (0) | 2023.08.19 |
정보처리기사 - 데이터 입출력 구현 #55~57 (0) | 2023.08.19 |
정보처리기사 - 데이터 입출력 구현 #50~54 (0) | 2023.08.19 |