T19. Time-space tradeoff란 둘을 동시에 개선하는 것은 절대 불가능하다는 뜻이다. 정답
F. "절대"가 함정 — 더 나은 알고리즘은 둘 다 줄이기도 한다. tradeoff는 흔히 맞바꾼다는 의미.
T20. Binary search는 매 단계 탐색 범위를 절반으로 줄인다. 정답
T. 그래서 O(log n).
Part B · Multiple Choice (20문항)
M1.n²/2 + 100n의 단순화는?
O(n)
O(n²)
O(n²/2)
O(100n)
정답
b) O(n²).
M2. O(log n)을 만드는 패턴은?
단일 loop
중첩 loop
매번 절반씩 줄임
2갈래 재귀
정답
c) 절반씩 줄임.
M3. enqueue/dequeue에 가장 좋은 것은?
list
deque
dict
set
정답
b) deque — popleft O(1).
M4. dict insert의 평균 시간은?
O(1)
O(n)
O(log n)
O(n²)
정답
a) O(1).
M5. 시간이 항상 O(n log n)인 정렬은?
Bubble
Selection
Merge
Quick
정답
c) Merge Sort.
M6. call frame에 들어있는 것은?
객체들
return 주소+지역변수+매개변수
heap
전역변수만
정답
b).
M7. 제곱을 이용한 power(x,n)의 복잡도는?
O(n)
O(log n)
O(n²)
O(1)
정답
b) O(log n) — 매번 절반.
M8. fib(30) naive 호출 수 ≈?
30
900
약 260만
60
정답
c) 약 260만.
M9. 평균 O(1)이 아닌 것은?
dict[k]
set add
list 검색
stack push
정답
c) list 검색 — O(n).
M10. 괄호 짝 검사기에 쓰는 구조는?
queue
stack
dict
재귀만
정답
b) stack.
M11. 행렬식의 여인수 전개는 본질적으로?
반복적
재귀적
O(1)
해싱
정답
b) 재귀적(부분행렬로 축소).
M12. index 접근이 없는 구조는?
list
set
array
string
정답
b) set — 무순서.
M13. in-place reverse의 공간은?
O(n)
O(1)
O(log n)
O(n²)
정답
b) O(1).
M14. 정렬된 두 리스트(len n,m) 병합의 시간은?
O(nm)
O(n+m)
O(log n)
O(1)
정답
b) O(n+m).
M15. 잘못된 자료구조 선택은 O(n)을 무엇으로 바꿀 수 있나?
O(1)
O(log n)
O(n²)
O(n)
정답
c) O(n²).
M16. Euclid GCD에서 gcd(48,18) 첫 단계는 gcd(18, ?)?
gcd(18,12)
gcd(18,0)
gcd(48,18)
gcd(12,6)
정답
a) gcd(18,12) — 48 mod 18 = 12.
M17. 가장 느리게 증가하는 것은?
O(n)
O(log n)
O(n log n)
O(n²)
정답
b) O(log n).
M18. 원반 n개 하노이탑에 필요한 이동 횟수는?
n
n²
2ⁿ−1
log n
정답
c) 2ⁿ−1.
M19. 파이썬에서 객체 참조는 보통 몇 바이트?
1
4
8
0
정답
c) 8바이트(주소를 담음).
M20. 중복 제거 + O(1) 멤버십을 동시에 원하면?
list
set
stack
queue
정답
b) set.
Part C · Coding (5문항)
C1. Fibonacci with memoization★★☆
memoization으로 fib(n)을 O(n)에 구현.
memo = {}
def fib(n):
if n in memo: return memo[n]
if n < 2: return n
memo[n] = fib(n-1) + fib(n-2)
return memo[n]
Time O(n)(각 fib(k) 1회), Space O(n).
C2. Balanced parentheses (stack)★★★
"({[]})" 같은 문자열이 올바른 괄호 짝인지 True/False.
def is_balanced(s):
pairs = {')':'(', ']':'[', '}':'{'}
stack = []
for ch in s:
if ch in'([{': stack.append(ch)
elif ch in pairs:
ifnot stack or stack.pop() != pairs[ch]:
returnFalsereturnnot stack
Time O(n), Space O(n).
C3. Binary search★★☆
정렬된 arr에서 target index 반환(없으면 −1), O(log n).
def binary_search(arr, target):
lo, hi = 0, len(arr)-1
while lo <= hi:
mid = (lo+hi)//2
if arr[mid] == target: return mid
elif arr[mid] < target: lo = mid+1
else: hi = mid-1
return -1
Time O(log n). 전제: 정렬.
C4. Count files recursively (tree)★★★
폴더를 {"files": int, "subfolders": [folder, ...]}로 표현할 때, 하위 폴더까지 포함한 총 파일 수를 재귀로.
def count_files(folder):
total = folder["files"] # 직속 파일for sub in folder["subfolders"]:
total += count_files(sub) # 같은 문제, 작은 입력return total
tree 구조 → 재귀가 두 줄. 반복문이면 explicit stack을 손수 만들어야.
C5. Merge two sorted lists★★☆
정렬된 a, b를 정렬 유지하며 병합.
def merge(a, b):
res, i, j = [], 0, 0
while i < len(a) and j < len(b):
if a[i] <= b[j]: res.append(a[i]); i += 1
else: res.append(b[j]); j += 1
res.extend(a[i:]); res.extend(b[j:])
return res
Time O(n+m). merge sort의 핵심 단계.
§4 Wrap-up — 마무리 · 오답 시 돌아갈 곳
틀린 문제 유형별로 교과서형 정리 노트의 해당 섹션으로 복귀하세요 — 복잡도 §2–4, 자료구조 §5, 메모리·재귀 §6–8, 손코딩 §9. 그리고 시험장 반입 치트시트는 정리 노트 §10을 손글씨(영어)로 옮기면 됩니다. T/F는 −1 감점이니 확실한 것만, 객관식은 빠짐없이.