2020년 5급 공채 기술 2차 자료구조론(필수)
문제 5개 · 100점. 참고 답안·채점 기준은 앱에서 볼 수 있습니다.
제1문 (10점)
다음은 C언어로 구현한 이진트리(Binary Tree) 순회프로그램이다. 물음에 답하시오. (총 10점)
| typedef struct TreeNode { int data; struct TreeNode *left, *right; }TreeNode; Ⓐ TreeNode n1= {1, NULL, NULL }; TreeNode n2= {4, &n1, NULL }; TreeNode n3= {16, NULL, NULL }; TreeNode n4= {25, NULL, NULL }; TreeNode n5= {20, &n3, &n4 }; TreeNode n6= {15, &n2, &n5 }; TreeNode *root= &n6; Ⓑ inorder( TreeNode *root ) { } preorder( TreeNode *root ) { } postorder( TreeNode *root ) { } void main() { inorder(root); preorder(root); postorder(root); } |
| TreeNode n1= {1, NULL, NULL }; TreeNode n2= {4, &n1, NULL }; TreeNode n3= {16, NULL, NULL }; TreeNode n4= {25, NULL, NULL }; TreeNode n5= {20, &n3, &n4 }; TreeNode n6= {15, &n2, &n5 }; TreeNode *root= &n6; |
| inorder( TreeNode *root ) { } preorder( TreeNode *root ) { } postorder( TreeNode *root ) { } |
- (1) Ⓐ부분을 통하여 만들어지는 트리구조를 표현하시오. (4점)
- (2) 중위순회(inorder), 전위순회(preorder), 후위순회(postorder)를 C언어의 순환호출(재귀함수)과 printf문을 이용하여 구현하고자 할 때 Ⓑ부분을 작성하시오. (6점)
제2문 (20점)
가중치 그래프에 대한 다음 물음에 답하시오. (총 20점)
[그림]
- (1) 위 그래프를 인접 행렬(adjacency matrix)로 표현하시오. (6점)
- (2) v1 노드를 시작점으로 하는 깊이우선 신장트리를 그리시오. (단, 가중치는 무시하며, 노드 방문은 노드 번호가 작은 것부터 방문한다) (6점)
- (3) v1 노드를 시작점으로 하여 Prim 알고리즘에 따라 최소비용 신장트리를 구성할 때 선택되는 간선(edge)들을 순서에 따라 나열하고, 이때 얻어지는 최소비용 신장트리를 그리시오. (8점)
제3문 (20점)
서로 다른 정수 n개를 저장하고 있는 이진탐색트리가 있다. 트리의 각 노드 구조는 그림과 같다.
이때 data는 키(key)로 사용되는 정수이고, 세 개의 포인터 p, left, right는 각각 해당 노드의 부모노드, 왼쪽자식, 오른쪽자식을 가리킨다.
예를 들어 (a)의 이진탐색트리는 (b)와 같이 구현할 수 있다.
(b)에서 ‘/’는 NULL 주소를 의미한다. 물음에 답하시오. (총 20점)
(a)
(b)
| p | |
| data | |
| left | right |
이때 data는 키(key)로 사용되는 정수이고, 세 개의 포인터 p, left, right는 각각 해당 노드의 부모노드, 왼쪽자식, 오른쪽자식을 가리킨다.
예를 들어 (a)의 이진탐색트리는 (b)와 같이 구현할 수 있다.
(b)에서 ‘/’는 NULL 주소를 의미한다. 물음에 답하시오. (총 20점)
(a)
[그림]
(b)
[그림]
- (1) 루트노드가 v인 이진탐색트리에 저장된 정수들 중 최소 정수를 저장하고 있는 노드를 찾는 알고리즘 AAA의 의사코드(pseudocode)를 작성하고 복잡도를 분석하시오. (8점)
- (2) 이진탐색트리의 어떤 노드 v에 정수 k가 저장되어 있다고 하자. 트리에 저장된 모든 정수를 오름차순으로 정렬했을 때, k 다음의 정수를 저장한 노드를 k의 successor라 한다. 1)에서 설계한 알고리즘 AAA를 이용하여, 주어진 노드 v의 successor를 찾는 알고리즘 BBB의 의사코드를 작성하고, 복잡도를 분석하시오. (단, k가 트리에 저장된 정수들 중 최대 정수이면 NULL을 반환한다) (12점)
제4문 (20점)
자연수 n을 입력받아 while문의 반복 횟수를 출력하는 알고리즘이다. 다음 물음에 답하시오. (총 20점)
input n;
i ← n;
cnt ← 0;
while i > 0 do
j ← n;
while j > i do
print i, j;
j ← j – 1;
cnt ← cnt + 1;
end while
i ← i – 1;
end while
print cnt;
i ← n;
cnt ← 0;
while i > 0 do
j ← n;
while j > i do
print i, j;
j ← j – 1;
cnt ← cnt + 1;
end while
i ← i – 1;
end while
print cnt;
- (1) 변수 n에 5를 입력하였을 경우, 변수 i와 j의 값이 변화하는 과정과 마지막으로 출력되는 변수 cnt의 값을 보이시오. (8점)
- (2) 이 알고리즘의 시간복잡도를 빅오(Big-Oh) 표기법으로 표현하고, 복잡도의 계산 과정을 보이시오. (12점)
제5문 (30점)
크기가 n인 배열 A[1..n]의 원소는 양의 정수이고, 마지막 원소 A[n]은 배열 A[1..n-1]의 모든 원소보다 크다. 배열 A에 대해 배열 B[i](1≤i< n)는 다음과 같이 정의된다.
배열 A[1..n]이 주어졌을 때, 배열 B[1..n-1]을 계산하는 프로그램을 작성하고자 한다. 다음 물음에 답하시오. (총 30점)
B[i] = min{ k : i < k and A[i] < A[k] }
배열 A[1..n]이 주어졌을 때, 배열 B[1..n-1]을 계산하는 프로그램을 작성하고자 한다. 다음 물음에 답하시오. (총 30점)
- (1) 배열 A가 다음과 같을 때, 배열 B[1..8]을 구하시오. (8점)
A[1..9] =1 2 3 4 5 6 7 8 9 4 20 4 15 10 8 10 13 99 - (2) 최악의 경우에 Θ(n2) 시간이 필요한 프로그램의 의사코드(pseudocode)를 작성하시오. (8점)
- (3) 스택을 사용하여 O(n) 시간을 필요로 하는 프로그램의 의사코드를 작성하시오. (단, 아래 스택 연산은 이미 구현되어 있다) (14점)-push(k): k를 스택에 삽입
-pop(): 스택의 가장 위 원소를 삭제하고, 그 값을 리턴
-top(): 스택의 가장 위 원소 리턴. 원소는 삭제하지 않음
-empty(): 스택이 비었으면 참