총 80문항 · 문제·정답·해설·개념 무료 학습
이 회차는 80문항입니다. 자료를 읽고 푸는 문항이 48문항입니다. 풀이가 붙은 문항이 80문항입니다.
▶ CertLab에서 풀어보기알고리즘의 조건에 대한 설명으로 옳은 것만을 모두 고르면?
ㄱ. 모든 명령은 모호하지 않고 명확해야 한다.
ㄴ. 모든 명령은 실행 가능한 연산이어야 한다.
ㄷ. 모든 명령은 반복적으로 무한히 실행되어야 한다.
정답 2번
알고리즘은 명령이 명확하고 실행 가능해야 하며 유한한 단계 안에 끝나야 한다. 무한 반복은 조건이 아니다. 정답은 2번.
알고리즘의 수행 시간 분석에 대한 설명으로 옳지 않은 것은?
정답 3번
최선의 경우는 다른 입력의 수행 시간보다 짧은 하한이고, 모든 입력을 덮는 상한은 최악의 경우가 맡는다.
다음은 그래프에서 너비 우선 탐색(breadth first search) 알고리즘이 동작하는 과정이다. (가) ~ (다)에 들어갈 내용을 바르게 연결한 것은?
[단계 1] 시작 정점을 ‘visited’로 표시하고 (가) 에(서) (나) 한다.
[단계 2] (가) 에(서) 정점을 (다) 하고, 제거한 정점의 인접 정점 중 아직 방문하지 않은 곳들은 ‘visited’로 표시하고 (가) 에(서) (나) 한다.
[단계 3] (가) 가/이 비워질 때까지 [단계 2]를 반복한다. (가) (나) (다)
정답 2번
너비 우선 탐색은 큐를 쓴다. 시작 정점과 새 인접 정점은 Enqueue로 넣고 정점은 Dequeue로 꺼낸다.
입력 크기 n 에 대한 수행 횟수를 빅오(big-oh) 표기법으로 표현했을 때 옳지 않은 것은?
정답 1번
빅오는 가장 빨리 커지는 항만 남긴다. 2^n은 n^4보다 빨리 커지므로 결과는 O(n^4)이 아니라 O(2^n)이다.
다음 의사코드(pseudo code)가 설명하는 정렬 알고리즘은?
○ 입력: 크기가 n인 배열 A
○ 출력: 정렬된 배열 A for i = 0 to n-2 min = i for j = i+1 to n-1 if(A[j] < A[min]) min = j A[i] ↔ A[min] return A
정답 3번
반복마다 남은 구간의 최솟값 위치를 찾아 맨 앞과 한 번 맞바꾸는 코드는 선택 정렬이다.
다음 fib() 함수는 피보나치 수열을 계산한다. fib(6)을 실행할 때, fib() 함수의 호출 횟수는? (단, fib(6)의 호출은 제외한다)
int fib(int n)
{
if(n == 0) return 0;
if(n == 1) return 1;
return ( fib(n-1) + fib(n-2) );
}
정답 4번
호출 횟수는 C(n)=1+C(n-1)+C(n-2)로 C(6)이 25번이며, 최초 호출을 빼면 24번이다.
(가) ~ (다)에 들어갈 점근 표기법은?
○ n ≥ n_0 인 모든 n 에 대해 c_1 g(n) ≤ f(n) ≤ c_2 g(n) 을 만족하는 양의 상수 c_1 , c_2 , n_0 가 존재하기만 하면 f(n) = (가) 이다.
○ n ≥ n_0 인 모든 n 에 대해 f(n) ≤ cg(n) 인 조건을 만족하는 양의 상수 c 와 n_0 가 존재하기만 하면 f(n) = (나) 이다.
○ n ≥ n_0 인 모든 n 에 대해 f(n) ≥ cg(n) 을 만족하는 양의 상수 c 와 n_0 가 존재하기만 하면 f(n) = (다) 이다. (가) (나) (다)
정답 3번
위아래를 함께 조이는 것이 Θ, 위로 막는 것이 O, 아래로 받치는 것이 Ω이다.
다음 재귀함수 power()는 xn을 계산한다. 빈칸에 들어갈 내용은?
double power(double x, int n)
{
if (n == 0) return 1;
return x *
}
정답 2번
x^n = x × x^(n-1)이므로 지수를 하나 줄여 부르면 n이 0에 닿아 재귀가 끝난다.
힙 정렬(heap sort)을 수행하기 위해 다음 데이터를 왼쪽부터 차례대로 하나씩 삽입하여 최소힙(min heap)을 구성하였다. 이후 루트를 한 번 삭제하고 최소힙 특성을 유지하기 위해 재조정한 후, 루트의 왼쪽 자식 노드의 값은?
4, 6, 8, 3, 7, 1, 5, 2, 9
정답 2번
삽입 뒤 최소힙은 1,2,3,4,7,8,5,6,9이고, 루트를 지우고 재조정하면 2,4,3,6,7,8,5,9라 루트의 왼쪽 자식은 4다.
다음 조건으로 퀵 정렬(quick sort)을 수행할 때, 처음 데이터 교환이 발생하는 배열의 인덱스 쌍은?
○ 데이터를 오름차순으로 정렬한다.
○ low는 왼쪽에서 오른쪽으로 탐색할 때, high는 오른쪽에서 왼쪽으로 탐색할 때 사용되는 변수이다.
○ 정렬할 데이터(A[])는 다음과 같으며, 피벗(pivot)의 초기값은 A[0]이고, low와 high의 초기값은 각각 1과 8이다.
정답 2번
피벗 23에서 low는 5를 지나 인덱스 2의 91에서 멈추고 high는 78과 42를 지나 인덱스 6의 18에서 멈춘다. 처음 교환은 (2, 6)이다.
재귀 알고리즘에 대한 설명으로 옳지 않은 것은?
정답 4번
재귀는 호출마다 스택 프레임이 쌓여 반복문보다 시간과 메모리를 더 쓰는 경우가 많다. 효율이 높다는 말은 틀렸다.
동적 계획(dynamic programming) 알고리즘에 대한 설명으로 옳지 않은 것은?
정답 2번
동적 계획법은 작은 부분 문제의 해를 저장해 두었다가 조합해 큰 문제의 해를 만든다. 큰 해를 쪼개어 작은 해를 얻는다는 말은 틀렸다.
다음 이진 탐색 트리(binary search tree)에서 키 48을 검색할 때, 방문하는 노드의 순서는?
정답 1번
이진 탐색 트리는 각 노드에서 키가 작으면 왼쪽, 크면 오른쪽 한 갈래만 따라간다. 48은 55, 15, 28, 30, 48 순으로 방문한다.
다음 정렬 알고리즘의 평균 시간복잡도를 바르게 연결한 것은?
(가) 선택 정렬 (나) 삽입 정렬 (다) 퀵 정렬 (라) 버블 정렬 (가) (나) (다) (라)
정답 4번
선택·삽입·버블 정렬은 평균 O(n^2), 퀵 정렬은 평균 O(n log n)이다.
(가)에 들어갈 내용은?
○ (가) 는 사용되는 문자가 N개일 때, 문자열 검색을 빠르게 실행할 수 있도록 설계된 N진 트리이다.
○ (가) 를 이용한 문자열 검색은 루트 노드에서 시작하여 탐색키의 첫 번째 문자에 연관된 링크를 따라 노드를 찾아가고 그 노드에서 다시 두 번째 문자에 연관된 링크를 따라 노드를 찾아가는 과정을 검색이 완료될 때까지 반복한다.
정답 4번
문자 하나마다 링크 하나를 따라 내려가며 문자열을 찾는 N진 트리는 트라이(trie)다.
다음에서 설명하는 알고리즘 설계 기법에 해당하지 않는 것은?
문제를 해결할 때 여러 경우 중 하나를 결정해야 할 때마다 현재 순간에 최적이라고 생각되는 것을 선택하면서 문제의 최종해에 도달한다.
정답 3번
다익스트라·프림·허프만은 매번 현재 최선을 고르는 그리디이고, 플로이드-워셜은 동적 계획법이다.
다음 그래프에서 Kruskal 알고리즘을 사용하여 최소 신장 트리(minimum spanning tree)를 찾을 때, 최소 신장 트리의 간선을 나열한 것은?
정답 3번
크루스칼은 가벼운 간선부터 사이클이 안 생기면 고른다. 결과는 c-e, g-h, f-g, a-b, c-h, c-d, b-c 일곱 개로 합 30이다.
알고리즘 설계 기법 중 분할정복(divide-and-conquer)에 대한 설명으로 옳지 않은 것은?
정답 1번
이진 탐색은 중간 원소와 견주어 절반을 버리는 대표적인 분할정복이다. 적용할 수 없다는 말이 틀렸다.
입력으로 길이 n 의 텍스트 문자열(T)과 길이 m 의 패턴 문자열(P)이 있을 때, 문자열 매칭(string matching) 알고리즘에 대한 설명으로 옳지 않은 것은?
정답 3번
보이어-무어는 패턴을 오른쪽 끝에서 왼쪽으로 비교하며 불일치 때 크게 건너뛴다.
백트래킹(backtracking)에 대한 설명으로 옳은 것만을 모두 고르면?
ㄱ. 너비 우선 탐색(breadth first search) 방식을 기반으로 한다.
ㄴ. 문제를 해결하는 과정에서 해를 더 이상 얻지 못하는 상황이 되면 직전 상황으로 되돌아가서 다시 해를 탐색하는 기법이다.
ㄷ. 적용할 수 있는 대표적인 문제로는 미로 찾기, N-여왕 문제 등이 있다.
정답 3번
백트래킹은 깊이 우선으로 탐색하다 막히면 직전 상황으로 되돌아가는 기법이며 미로 찾기, N-여왕 문제에 쓴다. 정답은 3번.
다음은 빅오( O ) 표기법에 해당하는 설명이다. (가), (나)에 들어갈 관계연산자를 바르게 연결한 것은?
어떤 양의 상수 c 와 n_0 이 존재하여 모든 n (가) n_0 에 대하여 f(n) (나) c · g(n) 을 만족하면 f(n) 은 O (g(n)) 에 속한다. (가) (나)
정답 4번
빅오는 n이 n0 이상인 모든 곳에서 f(n) ≤ c·g(n)이 성립하는 상한 표기다.
안정 정렬(stable sort) 알고리즘에 해당하지 않는 것은?
정답 1번
퀵 정렬은 멀리 떨어진 원소를 교환하므로 같은 값의 원래 순서가 뒤바뀔 수 있어 안정 정렬이 아니다.
다음과 같은 총 20 kg의 분할 가능한 금속 분말을 17 kg의 무게까지 허용 가능한 배낭에 넣으려 할 때, 그리디(greedy) 알고리즘으로 얻을 수 있는 최대 이익은?
금속 분말 이름 A B C 무게 10 kg 6 kg 4 kg 이익 200원 300원 400원
정답 3번
분할 가능한 배낭은 kg당 이익이 큰 순으로 담는다. C 4kg 400, B 6kg 300, A 7kg 140으로 840원이다.
입력 크기 n 에 대한 수행 횟수를 점근적 표기법으로 표현했을 때 옳지 않은 것은?
정답 4번
가장 빨리 자라는 항을 남기면 2n^2+log n+1000은 Θ(n^2)이라 Ω(n^2 log n)이 될 수 없다.
다음 이진트리(binary tree)가 이진탐색트리(binary search tree)의 조건을 만족하려면 제거되어야 할 단말 노드(leaf node)의 최소 개수는?
정답 3번
7의 왼쪽 서브트리의 8, 4의 왼쪽 서브트리의 6, 8의 왼쪽 자식 9가 규칙을 어겨 리프 3개를 제거해야 한다.
n × n 행렬 A 와 n × n 행렬 B 에 대하여 행렬 곱셈을 하고자 한다. 다음과 같은 행렬 C 의 각 원소를 구하는 공식을 이용하여 행렬 곱셈 결과인 행렬 C 를 만들 때 시간복잡도(time complexity)는? (단, 0 ≤ i , j ≤ n - 1 이다)
C_ij = Σ(k = 0~n - 1) A_ik B_kj
정답 2번
행렬 곱은 결과 원소 n^2개를 각각 n번의 곱셈으로 구하므로 Θ(n^3)이다.
힙(heap)과 힙 정렬에 대한 설명으로 옳은 것만을 모두 고르면? (단, 힙은 이진트리이고, n 은 원소의 개수를 나타낸다)
ㄱ. 힙은 완전이진트리(complete binary tree) 구조를 가진다.
ㄴ. 힙은 배열로 구현하기에 적합하지 않다.
ㄷ. 힙에 하나의 노드를 추가하는 데 걸리는 시간은 O (logn) 이다.
ㄹ. 힙 정렬의 수행시간은 O (n logn) 이다.
정답 4번
힙은 완전이진트리라 배열 구현에 알맞고 삽입은 O(log n), 힙 정렬은 O(n log n)이다. 정답은 4번.
입력 크기가 n 인 정렬 알고리즘에 대한 시간복잡도가 바르게 연결되지 않은 것은?
정렬 알고리즘 최악의 경우 평균적인 경우 최선의 경우
정답 2번
선택 정렬은 입력과 상관없이 항상 n(n-1)/2번 비교하므로 최선의 경우도 O(n^2)이다.
다음은 문자들에 대한 빈도수를 나타낸다. 이 문자들에 대한 허프만 코드(Huffman code)를 생성할 경우에 가장 긴 코드를 가진 문자의 비트수는?
문자 a b c d e f 빈도수 1 9 18 48 11 12
정답 3번
가장 작은 빈도 두 개씩 합치면 빈도 1과 9의 문자가 루트에서 네 칸 아래에 놓여 가장 긴 코드는 4비트다.
다음 파이썬 코드의 시간복잡도는? (단, n 은 1보다 큰 정수이다)
def abc(n) : if n == 1 : return 1 else : return n * abc(n - 1)
정답 3번
abc(n)은 abc(n-1)을 한 번씩만 부르며 n에서 1까지 내려가므로 T(n)=T(n-1)+c, 즉 O(n)이다.
다음 그래프에서 생성이 가능한 신장 트리(spanning tree)의 최대 개수는?
정답 3번
정점 4개의 완전그래프 신장 트리는 간선 6개에서 3개를 고르는 20가지에서 삼각형 4가지를 뺀 16개다.
위상 정렬(topological sort)을 적용할 때 모든 정점을 포함하는 결과가 생성될 수 없는 그래프는?
정답 3번
위상 정렬은 사이클이 없는 방향 그래프에서만 모든 정점을 늘어놓을 수 있다. 셋째 그림에는 B, F, C를 도는 사이클이 있다.
다음 설명에 해당하는 알고리즘은?
○ 모든 쌍 최단 거리(all pairs shortest path)를 구하는 알고리즘이다.
○ 음수의 가중치를 가진 간선(edge)이 있어도 수행될 수 있다.
○ 동적 계획법(dynamic programming)의 원리를 이용한다.
○ 시간복잡도는 O (n^3) 이다. (단, n 은 정점의 수이다)
정답 2번
모든 쌍 최단 거리, 음수 간선 허용, 동적 계획법, O(n^3)이면 플로이드-워셜이다.
다음 C언어로 작성된 함수의 입력값으로 13이 입력될 경우 출력되는 결과는?
void foo(int n) {
if(n != 0){
foo(n/2);
printf("%d", n%2);
}
}
정답 4번
foo(13)은 13, 6, 3, 1까지 내려간 뒤 되돌아오며 나머지 1, 1, 0, 1을 출력해 이진수 1101이 된다.
텍스트 문자열 01001에 대하여 패턴 문자열 001을 찾기 위해 브루트-포스(brute-force) 문자열 검색 알고리즘을 사용할 경우, 문자를 비교한 총 횟수는? (단, 패턴 문자열이 한번 검색되면 더 이상 검색하지 않는다)
정답 4번
시작 위치 0에서 2번, 위치 1에서 1번, 위치 2에서 3번 비교해 모두 6번이다.
다음 중 그리디 알고리즘에 해당하는 것만을 모두 고르면?
ㄱ. 라빈-카프(Rabin-Karp) 알고리즘
ㄴ. 병합 정렬 알고리즘
ㄷ. 다익스트라 알고리즘
ㄹ. 플로이드-워셜 알고리즘
정답 1번
그리디는 다익스트라뿐이다. 라빈-카프는 해시 문자열 매칭, 병합 정렬은 분할정복, 플로이드-워셜은 동적 계획법이다. 정답은 1번.
퀵 정렬 시 시간복잡도가 최악의 경우가 되는 것으로 가장 적절한 것은?
정답 1번
피벗이 늘 최댓값이나 최솟값이면 분할이 n-1개와 0개로 치우쳐 재귀 깊이가 n이 되고 O(n^2)이 된다.
분할 정복(divide-conquer) 문제 해결 기법을 이용하여 토너먼트 방식으로 64개의 축구팀 중 1등을 결정하기 위해 치르게 되는 최소의 경기 횟수는? (단, 모든 경기는 팀별 1 : 1 방식으로 진행되며 무승부 및 기권은 없다)
정답 3번
경기마다 한 팀이 탈락하므로 64팀 중 1등을 가리려면 63팀이 떨어져야 하고 경기는 63번이다.
다음 설명의 (가)에 들어갈 용어로 옳은 것은? (단, P ≠ NP이다)
어떤 문제 A가 다음을 모두 만족하면 (가) 이다.
○ 문제 A는 NP에 속한다.
○ 모든 NP 문제들은 다항식 시간에 문제 A로 변환할 수 있다.
정답 4번
NP에 속하면서 모든 NP 문제를 다항 시간에 이 문제로 변환할 수 있으면 NP-완전이다.
다음 의사코드(pseudo-code)로 표현된 알고리즘의 수행시간을 T (n) 으로 나타낼 때, T (n) 의 계산식과 T (n) 의 점근적 복잡도로 옳은 것은? (단, n 은 1보다 큰 정수이고 c 는 양의 상수이다)
algo(n) { if (n ≤ 1) return 0; return 1 + algo(n / 2); }
정답 2번
호출이 하나이고 n을 절반으로 줄이므로 T(n)=T(n/2)+c이며 c가 log2 n번 더해져 Θ(log2 n)이다.
다음 정수 열에서 연속 부분합의 최댓값은?
1, -3, 2, 4, -1, 5, -3, 2, 1, -2
정답 3번
연속 부분합의 최댓값은 2, 4, -1, 5를 잇는 10이다. 양수만 모은 15는 연속이 아니라서 답이 될 수 없다.
이진 탐색(binary search) 알고리즘에 대한 설명으로 옳지 않은 것은?
정답 2번
이진 탐색은 정렬된 데이터에서 범위를 절반씩 줄이며 O(log n)에 찾는다. 순서 없는 데이터에는 쓸 수 없다.
동적 계획법(dynamic programming)으로 설계된 알고리즘의 동작 방식에 대한 설명으로 옳지 않은 것은?
정답 4번
동적 계획법은 겹치는 부분 문제의 결과를 저장해 재사용한다. 메모하기는 연산을 줄여 속도를 높인다.
다음 정렬 알고리즘 중에서 동일한 최악 시간 복잡도를 가진 것만을 모두 고르면?
ㄱ. 선택 정렬(selection sort)
ㄴ. 삽입 정렬(insertion sort)
ㄷ. 힙 정렬(heap sort)
ㄹ. 퀵 정렬(quick sort)
정답 2번
선택·삽입·퀵 정렬의 최악은 n제곱이고 힙 정렬만 n log n이다. 정답은 2번.
그림과 같은 과정을 포함하여 정렬을 실행하는 알고리즘은?
정답 4번
그림처럼 정렬된 두 묶음을 하나로 합쳐 올라가는 과정이 병합 정렬의 핵심이다.
다음과 같은 배열 A에서 A[0]부터 삽입 연산을 차례대로 적용하여 이진 탐색 트리 T를 생성한 후, T를 전위(preorder) 순회 방법으로 방문한 값들을 배열 B에 B[0]부터 순차적으로 저장한 결과는?
A[] = 40, 20, 30, 10
정답 3번
이진 탐색 트리는 40 아래 20이 왼쪽이고 20 아래 10은 왼쪽, 30은 오른쪽이라 전위 순회는 40, 20, 10, 30이다.
30억 개의 정수를 갖는 배열에서 20개의 정수를 제외한 나머지가 모두 정렬되어 있다면, 이 배열을 가장 빠르게 정렬할 수 있는 알고리즘은?
정답 4번
거의 정렬된 배열에는 어긋난 원소만 옮기면 되는 삽입 정렬이 가장 빠르다.
알고리즘의 시간 복잡도에 대한 설명으로 옳은 것은?
정답 1번
최악 시간 복잡도는 실행 시간의 상한이라 가장 널리 쓰이고, 최선은 하한이다.
다항적 시간 복잡도를 갖는 탐욕(greedy) 알고리즘으로 최적의 해를 구할 수 없는 것은?
정답 3번
이진 트리의 최대합 경로는 큰 자식만 따라가는 탐욕으로 놓치는 경로가 있어 최적해가 보장되지 않는다.
해시(hash) 함수가 h(k) = k mod 8 이고 키값 (k) 이 15, 11, 5, 13, 22, 21 순서로 저장된 해시 테이블의 결과가 다음과 같은 경우에 사용된 충돌 해결 기법은?
인덱스 0 1 2 3 4 5 6 7 키값 22 21 11 5 13 15
정답 2번
표에서 충돌한 키가 한 칸씩 뒤로 밀려 들어갔으므로 선형 조사법이다.
함수 f(n) 에 대한 점근 표기법으로 옳지 않은 것은?
f(n) = 7n logn + logn - 20n + 6
정답 1번
f(n)은 n log n 꼴이라 Ω(n²) 아래 경계는 성립하지 않는다.
다음 문자열에 대하여 허프만 코딩(Huffman coding) 알고리즘으로 생성한 허프만 트리에서 루트(root) 노드부터 가장 깊은 단말(leaf) 노드까지 도달하기 위한 단순 경로상의 간선(edge) 개수는?
AAAEEBCCDDDDCCEEEAADDEEEBB
정답 1번
빈도 3, 4, 5, 6, 8을 작은 것부터 합치면 가장 깊은 잎 B, C가 루트에서 간선 3개 떨어진다.
그래프(graph) 구조로 데이터를 저장하고 그래프 알고리즘을 이용하여 문제를 해결하는 대표적인 예만을 모두 고르면?
ㄱ. 소셜 네트워크에서 친구 추천하기
ㄴ. 가장 적은 수의 동전으로 거스름돈 돌려받기
ㄷ. 최소 비용의 여행 경로 탐색하기
ㄹ. 정렬된 1차원 배열 구조에서 특정값 빠르게 찾기
정답 1번
친구 추천과 최소 비용 경로는 그래프 문제이고 동전 거스름돈과 정렬 배열 탐색은 그렇지 않다. 정답은 1번.
다음 C 프로그램의 실행 결과는?
#include <stdio.h> int count = 0; int A[] = {1, 3, 5, 8, 12, 15, 20, 24, 30, 44, 52, 61, 64, 70, 81, 90}; int bin(int low, int high, int key) { int mid; count++; if (low > high) return 0; else { mid = (low + high) / 2; if (key == A[mid]) return 1; else if (key < A[mid]) return bin(low, mid - 1, key); else return bin(mid + 1, high, key); } } int main() { bin(0, 15, 22); printf("count: %d, ", count); bin(0, 15, 52); printf("count: %d\n", count); return 0; }
정답 3번
22는 다섯 번, 52는 네 번 호출하고 count는 누적되므로 출력은 count: 5, count: 9이다.
다음 그래프에서 크루스칼(Kruskal) 알고리즘으로 최소 신장 트리(MST)를 생성할 때 다섯 번째로 추가되는 간선은? (단, 초기 MST는 공집합이다)
정답 1번
가중치 순 검토에서 사이클을 만드는 (b,c)와 (c,d)는 건너뛰고 (b,f)가 다섯 번째로 붙는다.
다음 최대 힙(max heap)에 노드 25가 추가될 경우, 최대 힙 성질을 만족하도록 삽입 연산이 완료된 후의 구조로 옳은 것은?
정답 1번
25를 마지막 자리에 붙인 뒤 부모 2, 루트 20과 차례로 교환해 25가 루트가 된다.
백트래킹(backtracking)에 대한 설명으로 옳지 않은 것은?
정답 4번
백트래킹은 스택이나 재귀로 구현하고 제약 문제에 쓰며 균형 트리를 유지하지 않는다.
문자열 매칭을 위한 알고리즘으로 옳지 않은 것은?
정답 2번
벨만-포드는 최단 경로 알고리즘이지 문자열 매칭 알고리즘이 아니다.
다음 그래프에서 A부터 깊이 우선 탐색(depth first search)을 수행하는 경우, 가능한 정점의 방문 순서로 옳지 않은 것은?
정답 2번
DFS는 막히면 방문하지 않은 이웃이 남은 가장 가까운 정점으로 돌아가야 하므로 G 다음에 E는 올 수 없다.
다음 함수는 0보다 큰 자연수 n이 입력될 때, 1 2 3 4 … n 순서로 출력하는 재귀 함수이다. (가) ~ (다)에 들어갈 내용을 바르게 연결한 것은?
void fun(int n) if ( (가) ) (나) (다) (가) (나) (다)
정답 4번
if는 (나) 한 문장만 다스리고 (다)는 조건 밖이다. n>1일 때 fun(n-1)을 먼저 부르고 출력해야 1부터 n까지 나온다.
다음은 1 이상인 x에 대해 1부터 x까지의 합을 계산하는 C 함수이다. (가)에 들어갈 코드는?
int sum(int x) {
if (x <= 1) return 1;
return x + (가) ;
}
정답 4번
sum(x)는 x에 sum(x-1)을 더하고 x가 1 이하이면 1을 돌려주어야 1부터 x까지의 합이 된다.
다음 설명에 해당하는 알고리즘은?
○ 문자열 매칭 알고리즘이다.
○ 주어진 패턴과 텍스트에서 사용된 알파벳을 이용해 불일치 문자(bad character) 이동표를 만든다.
○ 패턴을 이용해서 일치 접미부(good suffix) 이동표를 만든다.
정답 3번
불일치 문자 이동표와 일치 접미부 이동표를 모두 쓰는 문자열 매칭은 보이어-무어다.
분할 정복(divide and conquer) 방식의 정렬 알고리즘만을 모두 고르면?
ㄱ. 버블 정렬(bubble sort)
ㄴ. 병합 정렬(merge sort)
ㄷ. 퀵 정렬(quick sort)
정답 4번
병합 정렬과 퀵 정렬은 분할 정복이고 버블 정렬은 그렇지 않다. 정답은 4번.
빅오( O ) 표기법에 대한 설명으로 옳지 않은 것은?
정답 3번
빅오는 위쪽 경계라서 n log n보다 느리게 자라는 3n+log n+2도 O(n log n)에 포함된다.
다음 그래프에서 크루스칼(Kruskal) 알고리즘을 사용하여 만든 최소 비용 신장 트리(minimum cost spanning tree)는?
정답 1번
가중치 2, 3, 4, 5, 8, 9 간선을 차례로 고르고 사이클이 되는 6은 건너뛴다.
충분히 큰 n에 대해서 수행 시간이 가장 많이 걸리는 시간 복잡도는?
정답 3번
n!은 지수 함수보다도 빨리 자라므로 충분히 큰 n에서 가장 오래 걸린다.
다음 의사코드에 해당하는 알고리즘 설계기법은?
f[ ]: 모든 값이 0으로 초기화된 정수 배열
fib(n)
{
if (f[n] == 0) {
if (n == 1 or n == 2) f[n] = 1;
else f[n] = fib(n - 1) + fib(n - 2);
}
return f[n];
}
정답 4번
f 배열에 결과를 저장해 다시 쓰는 재귀는 메모이제이션을 쓰는 동적 프로그래밍이다.
다음 그래프의 A 정점부터 너비 우선 탐색(BFS, breadth first search)을 할 때, 가능한 정점의 방문 순서가 아닌 것은?
정답 4번
BFS는 A에서 가까운 층부터 방문하므로 두 칸 거리의 E가 한 칸 거리의 B보다 먼저 나올 수 없다.
다음 방향 그래프에 벨만-포드(Bellman-Ford) 알고리즘을 적용한 후, 각 정점과의 최단 거리 값을 바르게 연결한 것은? (단, 시작 정점은 A 정점이다)
A B C D E F G
정답 2번
벨만-포드로 구한 A로부터의 최단 거리는 B 1, C 3, D 5, E 0, F 4, G 3이다.
다음 방향 그래프에서 2개 이상의 정점이 포함되어 있는 강한 연결 요소(strongly connected component)의 개수는?
정답 2번
강한 연결 요소 중 정점이 둘 이상인 것은 {A, E, B}와 {D, G, H} 두 개다.
다음 배열에서 버블 정렬 알고리즘을 사용하여 오름차순 정렬했을 때, 자리바꿈의 총횟수는?
배열 65 40 80 15 오름차순 방향 →
정답 2번
버블 정렬의 자리바꿈 횟수는 뒤바뀐 짝의 수와 같아 65 40 80 15에서는 4번이다.
다음 표와 같이 분말이 있을 때, 40 kg 무게까지 허용가능한 배낭에 최대 이익을 얻을 수 있도록 분말을 넣는 알고리즘의 C 프로그램이 아래와 같다. (가), (나)에 들어갈 코드와 출력값을 바르게 연결한 것은? (단, 배낭에 각 분말 일부만 넣을 수도 있다)
분말 종류 보유량(kg) 이익
A 10 60
B 18 90
C 25 100
D 15 120
#include
int main() {
double wgt[] = {10, 18, 25, 15};
double val[] = {60, 90, 100, 120};
double ratio[4] = {}, W = 40, max_r,
totalVal = 0.0;
int i, max_i;
for (i = 0; i < 4; i++)
ratio[i] = (가) ;
while (W > 0) {
max_r = -1.0;
max_i = -1;
for (i = 0; i < 4; i++) {
if (wgt[i] > 0 && ratio[i] > max_r) {
max_r = ratio[i];
max_i = i;
}
}
if (max_i == -1) break;
if (W >= wgt[max_i]) {
W -= wgt[max_i];
totalVal += val[max_i];
}
else {
totalVal += val[max_i] * (나) ;
break;
}
wgt[max_i] = 0;
}
printf("%.1f\n", totalVal);
return 0;
}
(가) (나) 출력값
정답 1번
무게당 이익 val/wgt 큰 순으로 담고 마지막은 W/wgt만큼 담아 D, A와 B의 15/18로 255.0이다.
다음 C 프로그램의 실행 결과에 포함되지 않는 것은?
#include
int count = 0;
void f(int n, char from, char tmp, char to){
count++;
if (n == 1)
printf("%d: 원판 %d를(을) %c에서 %c로 이동\n", count, n, from, to);
else {
f(n - 1, from, to, tmp);
printf("%d: 원판 %d를(을) %c에서 %c로 이동\n", count, n, from, to);
f(n - 1, tmp, from, to);
}
}
int main() {
f(3, 'a', 'b', 'c');
return 0;
}
정답 3번
count는 호출 때 오르고 출력은 하위 호출 뒤라 원판 1이 b에서 a로 가는 줄의 번호는 5가 아니라 6이다.
비어있는 이진 탐색 트리(binary search tree)에 다음 키값이 순서대로 입력되면, 15를 찾기 위해 방문해야 하는 노드의 개수는?
50, 40, 30, 35, 20, 15, 25, 10
정답 3번
15까지 50, 40, 30, 20, 15의 다섯 노드를 방문한다.
다음 배열에서 보간 탐색(interpolation search)으로 58을 찾고자 할 때, 첫 번째 탐색 위치는? (단, 배열에서 위치의 차이는 값의 차이에 비례한다는 가정하에 탐색 위치를 계산하며 소수점 이하는 반올림한다)
위치 0 1 2 3 4 5 6 7 8 9 배열 3 7 12 22 32 58 67 80 87 89
정답 3번
보간 탐색의 첫 위치는 0+(58-3)/(89-3)×9≈5.76이므로 반올림해 6이다.
다음과 같이 전체 버킷 개수가 13개이고 버킷당 1개의 슬롯을 가지는 비어있는 해시 테이블에 값 를 순서대로 해시 함수를 사용하여 저장하였을 때, 버킷 번호 4에 저장되는 값은? (단, 해시 함수로 h(x) = x mod 13 을 사용하며, 충돌 해결은 개방 주소 방법의 선형 조사법(linear probing)을 적용한다)
버킷 번호 슬롯 0 1 2 3 4 5 6 7 8 9 10 11 12
정답 3번
선형 조사로 67은 2, 3번이 차 있어 4번에 저장된다.
다음 두 문자열 A와 B의 편집 거리(edit distance)는? (단, 허용하는 문자열 연산은 삽입, 삭제, 교체 연산이다)
○ 문자열 A: algorithm
○ 문자열 B: anthem
정답 2번
algorithm에서 anthem으로 가는 편집 거리는 교체 1, 삭제 4, 삽입 1로 6이다.
다음 배열에 대해 아래 알고리즘을 적용하여 정렬하고자 한다. 3번째 for 루프를 수행할 때, 배열 내에서 교환되는 두 값은?
위치 0 1 2 3 4 5 6 7 8 9 배열 9 21 54 32 77 45 19 83 12 3 Sort(A[], n): // n은 입력배열 A의 크기이다. for last ← (n – 1) downto 1 A[0 ... last] 중 가장 큰 수 A[k]를 찾는다. A[k]와 A[last]의 값을 교환한다.
정답 1번
선택 정렬의 세 번째 반복은 last가 7이라 A[0..7]의 최댓값 54와 A[7]의 3을 바꾼다.
다음과 같이 오름차순 정렬을 수행하는 알고리즘은?
초기 상태 5 20 17 6 2 13 10 1단계 5 20 17 6 2 13 10 2단계 5 17 20 6 2 13 10 3단계 5 6 17 20 2 13 10 4단계 2 5 6 17 20 13 10 5단계 2 5 6 13 17 20 10 6단계 2 5 6 10 13 17 20
정답 2번
왼쪽 정렬 구간에 새 원소를 끼워 넣으며 늘려 가므로 삽입 정렬이다.
문자에 대한 빈도수가 다음과 같을 때, exam을 허프만(Huffman) 코드로 작성하면 비트 수는?
문자 a b c e m x 빈도수 8 5 3 10 6 1
정답 1번
허프만 트리에서 e, a, m은 2비트, x는 4비트이므로 exam은 2+4+2+2로 10비트다.