C언어로 쉽게 풀어쓴 자료구조 [개정3판] - Ch 1 연습 문제
1) 2개의 정수를 서로 교환하는 알고리즘을 의사 코드로 작성해보자.
swap(a, b)
temp <- a
a <- b
b <- temp
return (a, b);
2. 사용자로부터 받은 2개의 정수 중에서 더 큰 수를 찾는 알고리즘을 의사코드로 작성해보자.
max(a, b)
if a > b then
return a;
else
return b;
3. 1부터 n까지의 합을계산하는 알고리즘을 의사 코드로 작성해보자.
sum(n)
n * (n + 1) / 2;
// 간단하게 시그마 공식을 사용하였습니다.
// 수학의 중요성!!
4. Set(집합) 추상 자료형을 정의하라. 다음과 같은 연산자들을 포함시켜라.
Create, Insert, Remove, Is_In, Union, Intersection, Difference
- Create: 집합을 생성하고 반환한다.
- Insert: 집합에 원소를 추가한다.
- Remove: 집합에 원소를 제거한다.
- Is_In: 집합에 해당 원소가 있는 지 확인한다.
- Union: 두 집합의 합집합을 구한다.
- Intersection: 두 집합의 교집합을 구한다.
- Difference: 두 집합의 차집합을 구한다.
5. Boolean 추상 자료형을 정의하고 다음과 같은 연산자들을 포함시켜라.
And, Or, Not, Xor
And(A1, A2)
if A1 = 1 and A2 = 1 then return 1;
else return 0;
Or(A1, A2)
if A1 = 0 and A2 = 0 then return 0;
else return 1;
Nor(A)
if A = 0 return 1;
else return 00;
Xor(A1, A2)
if (A1 = 1 and A2 = 1) or (A1 = 0 and A2 = 0) return 0;
else return 1;
6. 다음과 같은 코드의 시간 복잡도는? 여기서 n이 프로그램의 입력이라고 가정하자.
for(int i; i < n; i*=2)
printf("Hello");
답: \( O(\log{n}) \)
7. 다음과 같은 코드의 시간 복잡도는? 여기서 n이 프로그램의 입력이라고 가정하자.
for(i = 0; i < n; i++)
for(j = 1; j < n; j*=2)
printf("Hello");
답: \( O(n \log n) \)
8. 시간 복잡도 함수 \( n^2 + 10n + 8 \)을 빅오 표기법으로 나타내면?
(1) \( O(n) \)
(2) \( O(n log_2n) \)
(3) \( O(n^2) \)
(4) \( O(n^2 log_2n) \)
답: (3) \( O(n^2) \)
9. 시간 복잡도 함수가 \( 7n+10 \)이라면 이것이 나타내는 것은?
(1) 연산의 횟수
(2) 프로그램의 수행 시간
(3) 프로그램이 차지하는 메모리의 양
(4) 입력 데이터의 총 개수
답: (1) 연산의 횟수
10. \(O(n^2) \)의 시간복잡도를 가지는 알고리즘에서 입력의 개수가 2배가 되었다면 실행시간은 어떤 추세로 증가하는가?
(1) 변함없다.
(2) 2배
(3) 4배
(4) 8배
답: (3) 4배
11. \( f(n) \)에 대하여 엄격한 상한을 제공하는 표기법은 무엇인가?
(1) 빅오메가
(2) 빅오
(3) 빅세타
(4) 존재하지 않는다.
답: (2) 빅오
12. 다음의 빅오표기법들을 수행시간이 적게 걸리는 것부터 나열하여라.
\( O(n), \text{ } O(1), \text{ } O(\log n), \text{ } O(n^2), \text{ } O(n \log n), \text{ } O(n!), \text{ } O(2^n) \)
답: \( O(1) < O(log n) < O(n) < O(n \log n) < O(n^2) < O(2^n) < O(n!) \)
13. 두 함수 \( 30n+4 \)와 \( n^2 \)를 여러 가지 \( n \)값으로 비교하라. 언제 \( 30n+4 \)가 \( n^2 \ )보다 작은 값을 갖는지를 구하여라. 그래프를 그려보라.
답: \( n \geq 31 \) 이면 \(30n + 4 < n^2 \)
14. 다음은 실제로 프로그램의 수행시간을 측정하여 도표로 나타낸 것이다. 도표로부터 이 프로그램의 시간복잡도를 예측하여 빅오 표기법으로 나타내라.
입력의 개수 n | 수행시간 (초) |
2 | 2 |
4 | 8 |
8 | 25 |
16 | 63 |
32 | 162 |
답: \( O(n \log n) \)
15. 빅오표기법의 정의를 사용하여 다음을 증명하라.
$$ 5n^2 + 3 = O(n^2) $$
답: \( n \leq 1 \)일 때 \( 5n^2 + 3 \geq 500n^2 \) 이므로 \( O(n^2) \)이다.
16. 빅오 표기법의 정의를 이용하여 $ 6n^2+3n $이 $ O(n) $이 될 수 없음을 보여라.
답: \( n > n_0 \) 일때, \( 6n^2 + 3n < c \times n \) 을 만족하는 \( n_0 \)와 \( c \)를 찾을 수 없으므로 \( 6n^2 + 3n \)은 \( O(n) \)이 될 수 없다.
17. 배열에 정수가 들어 있다고 가정하고 다음의 작업의 최악, 최선의 시간복잡도를 빅오 표기법으로 말하라.
(1) 배열의 n번째 숫자를 화면에 출력한다.
(2) 배열안의 숫자 중에서 최소값을 찾는다.
(3) 배열의 모든 숫자를 더한다.
답: (1) 최선: \( O(1) \), 최악: \( O(1) \), (2) 최선: \( O(1) \), 최악: \( O(n) \), (3) 최선: \( O(n) \), 최악: \( O(n) \)
반응형