2017년 5급 공채 기술 2차 자료구조론(선택)
문제 5개 · 50점. 참고 답안·채점 기준은 앱에서 볼 수 있습니다.
제1문 (10점)
범위 최소 질의(Range Minimum Query, RMQ) 문제는 다음과 같이 정의된다. 크기가 n인 배열 A[0..n-1]에 서로 다른 정수들이 저장되어 있고, 0≤a≤b≤n-1인 두 정수 a, b가 질의로 주어졌을 때 A[a], A[a+1], ..., A[b] 중 가장 작은 값을 반환한다. 단순한 순차검색 알고리즘의 시간 복잡도는 최악의 경우 O(n)이다. 물음에 답하시오. (총 10점)
- (1) 알고리즘의 성능 개선을 위해 배열 A를 A[0]...A[\sqrt{{n}}-1], A[\sqrt{{n}}]...A[2\sqrt{{n}}-1], ... , A[n-\sqrt{{n}}]...A[n-1]과 같이 길이가 \sqrt{n}인 구간을 \sqrt{n}개 만든 다음, 각 구간의 최소값을 미리 구한다. 이 과정의 시간 복잡도가 O(n)임을 보이시오. (3점)
- (2) 1)에서 구한 결과를 이용하여 두 정수 a, b에 대한 RMQ 문제에 답하는데 최악의 경우 O(\sqrt{{n}}) 시간이 걸리는 알고리즘을 설명하고, 시간 복잡도가 위와 같음을 보이시오. (7점)
제2문 (10점)
배열 B는 n개의 상이한 정수들이 오름차순으로 정렬된 배열이다. 배열 A는 배열 B의 원소들을 오른쪽으로 k(0≤k<n)만큼씩 원형으로 이동한 배열이다. 예를 들어서 B=(15, 25, 37, 39, 45, 52)일 때, A=(45, 52, 15, 25, 37, 39)는 k=2만큼 이동한 배열이고, A=(37, 39, 45, 52, 15, 25)는 k=4만큼 이동한 배열이다. 다음 물음에 답하시오. (단, 배열의 첨자는 0부터 시작한다고 가정한다) (총 10점)
- (1) 배열 A와 정수 k를 입력받아 A에서 가장 큰 원소를 찾는 시간 복잡도가 O(1)인 알고리즘을 설명하시오. (3점)
- (2) k는 알려지지 않은 채 배열 A만 주어졌을 때, A에서 가장 큰 원소를 찾는 시간 복잡도가 O(log n)인 알고리즘의 핵심 아이디어를 설명하고, 이를 C 언어와 유사한 의사코드(pseudo code)로 작성하시오. (7점)
제3문 (10점)
어느 지역 내 특정 도시에 병원과 장애인 복지센터를 세우고 전력선을 설치하고자 한다. 그 지역의 도시를 정점(vertex)으로 도시 간의 도로를 간선(edge)으로 표시한 그래프가 다음과 같다. 물음에 답하시오. (단, 간선의 숫자는 도로의 거리를 표시한 것이다) (총 10점)
1
3
5
2
7
3
2
4
2
10
4
11
3
5
2
7
3
2
4
2
10
4
11
- (1) 병원은 각 도시로부터 병원이 위치할 도시까지의 거리 합이 최소가 되는 도시에 세우려고 한다. 병원이 세워질 도시와 각 도시 간의 거리의 합을 구하시오. (5점)
- (2) 장애인 복지센터가 위치하는 도시는 각 도시로부터 장애인 복지센터가 위치할 도시까지의 거리 중 최장인 거리가 가장 짧은 곳에 세우려고 한다. 장애인 복지센터가 세워질 도시를 구하시오. (3점)
- (3) 정점 4에 전력회사를 세워 각 도시에 전기가 공급되도록 전력선을 깔려고 한다. 전력선을 가장 짧게 연결할 수 있도록 전력선 망을 설계하는 과정을 보이시오. (2점)
제4문 (10점)
ASCII 문자들로 구성된 길이가 m과 n인(n>m) 문자열(string) s1과 s2가 있다. 다음 물음에 답하시오. (단, ASCII 문자는 총 256개의 서로 다른 값을 갖는다) (총 10점)
- (1) s1과 s2를 비교하여, 양쪽에 모두 있는 문자들을 전부 찾아 출력하는 알고리즘을 설계하려고 한다. 시간 복잡도(time complexity)가 O(mn) 걸리는 알고리즘을 설계하라. (2점)예) 입력:s1 = "data structure", s2 = "algorithm analysis"
출력:a, t, s, r (단, 출력 순서는 상관 없음) - (2) 1)의 알고리즘보다 시간 복잡도가 향상된 O(n)의 시간이 걸리는 알고리즘을 설계하라. (3점)
- (3) s1이 s2에 포함되는지 즉, s1이 s2의 sub-string인지를 판정하는 시간 복잡도가 O(n)인 알고리즘을 구현할 수 있다면 그러한 알고리즘을 제시하고, 없다면 그 이유를 설명하시오. (5점)
제5문 (10점)
각 노드가 다음과 같은 구조체인 이진 탐색 트리가 그림과 같이 구성되어 있다.
단, 리프(leaf)노드의 size는 1이며 리프(leaf)가 아닌 노드의 size는 아래과 같이 정의된다.
node→size = node→left→size + node→right→size + 1
물음에 답하시오. (총 10점)
struct node {
char key;
int size;
struct node *left, *right;
};
typedef struct node node_t;
char key;
int size;
struct node *left, *right;
};
typedef struct node node_t;
H
7
L
2
N
1
G
4
B
3
E
1
A
1
root
7
L
2
N
1
G
4
B
3
E
1
A
1
root
단, 리프(leaf)노드의 size는 1이며 리프(leaf)가 아닌 노드의 size는 아래과 같이 정의된다.
node→size = node→left→size + node→right→size + 1
물음에 답하시오. (총 10점)
- (1) 루트 노드 root가 가리키는 이진 탐색 트리에서 size 필드를 이용하여 key 값이 i-번째 순위의 노드를 반환하는 함수를 oSelect(root, i)라고 한다. 예를 들어, 위 그림에서 oSelect(root, 5)를 입력하면 ‘노드 H’의 포인터가 반환된다. 아래의 oSelect() 함수를 완성하시오. (단, 파라미터 i는 항상 범위 안의 값을 가진다고 가정한다) (7점)node_t *oSelect(node_t *node, int odr)
{
} - (2) 균형이진트리의 경우와 최악의 경우 각각에 대하여, 함수 oSelect()의 시간복잡도를 big-O로 표현하고 그 이유를 설명하시오. (단, 전체 노드의 개수는 N이라고 가정한다) (3점)