알고리즘과 복잡도: 해설이 있는 연습 문제

힌트와 해설이 있는 무료 알고리즘과 복잡도 객관식 연습 문제, 세 가지 난이도: 핵심 용어와 사실, 개념 적용, 사례와 분석.

무료 연습 문제쉬움

n이 클 때 가장 빠르게 증가하는 복잡도 클래스는 무엇입니까?

다음 문제 →
알고리즘과 복잡도 무료로 연습하기지금 알고리즘과 복잡도 연습하기매일 무료 문제 5개. 카드 등록이 필요 없습니다.

연습 내용

  1. 쉬움핵심 용어와 사실
  2. 보통개념 적용
  3. 어려움사례와 분석

알고리즘과 복잡도 처음부터 배우기

1복잡도가 재는 것

알고리즘은 문제를 푸는 유한한 정확한 단계의 목록입니다. 예를 들어 목록을 정렬하거나 전화번호부에서 이름을 찾는 것입니다.

두 알고리즘이 같은 문제를 풀어도 걸리는 시간은 크게 다를 수 있습니다. 복잡도는 입력이 커질 때 작업량이 어떻게 늘어나는지를 나타냅니다.

입력의 크기를 n이라고 합니다. 정렬할 항목의 수, 목록의 길이, 그래프의 노드 수 등입니다.

1000쪽짜리 전화번호부에서 이름을 찾는다고 생각해 보세요. 모든 쪽을 읽으면 최대 1000단계가 걸립니다. 가운데를 펴서 매번 절반으로 줄이면 약 10단계가 걸립니다.

시간 복잡도는 단계 수를 셉니다. 공간 복잡도는 추가 메모리를 셉니다. 둘 다 n의 함수로 씁니다.

보통은 최악의 경우를 봅니다. 크기 n인 모든 입력 중 작업량이 가장 많은 경우입니다. 때로는 평균의 경우나 최선의 경우를 묻기도 합니다.

자가 점검 작업량이 n²처럼 늘어나는 알고리즘이 n = 1000일 때 1초가 걸린다. n = 2000일 때는 대략 얼마나 걸리는가?
  1. 1초
  2. 2초
  3. 4초
  4. 8초

답: 4초. n을 두 배로 하면 n²에 2² = 4가 곱해지므로 시간은 약 1초에서 약 4초가 됩니다. 2초는 선형 증가의 답이고, 8초는 n³의 답입니다.

2빅오와 증가율의 부류

빅오 표기는 n이 클 때 중요한 것만 남깁니다. 상수 인수를 버리고 가장 빨리 커지는 항만 남깁니다.

3n² + 5n + 2 ⇒ O(n²)

n = 1000이면 n² 항은 3 000 000이고 5n은 5000에 불과합니다. 작은 항은 전체를 거의 바꾸지 못합니다.

이 부류들은 느린 증가에서 빠른 증가 순으로 계속 나타납니다.

  • O(1), 상수: 인덱스로 배열 원소 읽기.
  • O(log n), 로그: 이진 탐색. 단계마다 문제를 절반으로 줄입니다.
  • O(n), 선형: 모든 항목을 한 번 훑기. 예를 들어 최댓값 찾기.
  • O(n log n): 병합 정렬 같은 좋은 정렬 알고리즘.
  • O(n²), 이차: 항목에 대한 이중 반복문. 예를 들어 버블 정렬.
  • O(2ⁿ), 지수: 모든 부분집합을 시도. 금방 쓸 수 없게 됩니다.
ntlog nnn log nn²2ⁿ

빅오는 상한입니다. 작업량이 기껏해야 이만큼 빨리 늘어납니다. Ω(빅 오메가)는 하한이고, Θ(세타)는 상한이면서 하한인 정확한 경계입니다.

로그의 밑은 빅오에서 중요하지 않습니다. 밑이 다른 로그는 상수배만큼만 다르기 때문입니다.

자가 점검 4n + 2n² + 100의 빅오는 무엇인가?
  1. O(100)
  2. O(2n²)
  3. O(n)
  4. O(n²)

답: O(n²). n이 크면 n² 항이 지배하고 상수 인수 2는 버립니다. O(n)은 잘못된 항을 남긴 것이고, O(2n²)은 상수를 버리지 않은 것입니다.

3탐색, 정렬, 재귀

몇몇 알고리즘은 거의 모든 강의에 나옵니다. 그 복잡도를 사실로 외워 두세요.

  • 선형 탐색은 항목을 하나씩 확인합니다: O(n). 이진 탐색은 정렬된 배열이 필요하며 단계마다 범위를 절반으로 줄입니다: O(log n).
  • 버블, 삽입, 선택 정렬은 이중 반복문에서 항목을 비교하고 교환합니다: O(n²). 삽입 정렬은 이미 정렬된 배열에서 O(n)입니다.
  • 병합 정렬은 배열을 절반으로 나누어 각각 정렬한 뒤 합칩니다: 모든 경우에 O(n log n)이며 추가 메모리는 O(n)입니다.
  • 퀵 정렬은 피벗을 기준으로 나눕니다: 평균 O(n log n)이지만 최악의 경우에는 O(n²)입니다. 예를 들어 정렬된 배열에서 첫 원소를 피벗으로 쓸 때입니다.
  • 항목을 비교하기만 하는 정렬은 최악의 경우 Ω(n log n)을 넘어설 수 없습니다. 계수 정렬은 비교하지 않으므로 더 빠릅니다.

재귀 함수는 더 작은 입력으로 자기 자신을 호출하다가, 직접 답할 수 있는 기저 사례에 이릅니다. 실행 시간은 점화식으로 씁니다.

  • T(n) = T(n/2) + O(1)은 이진 탐색처럼 O(log n)을 줍니다.
  • T(n) = 2T(n/2) + O(n)은 병합 정렬처럼 O(n log n)을 줍니다.
  • T(n) = T(n − 1) + O(n)은 O(n²)을 줍니다.
  • T(n) = 2T(n − 1) + O(1)은 O(2ⁿ)을 줍니다.

알아 둘 만한 설계 아이디어가 셋 있습니다. 분할 정복은 나누고, 풀고, 합칩니다. 탐욕은 단계마다 지역적으로 가장 좋은 선택을 합니다. 동적 계획법은 겹치는 부분 문제의 답을 저장해 한 번만 계산합니다.

자가 점검 퀵 정렬의 최악의 경우 시간 복잡도는 무엇인가?
  1. O(log n)
  2. O(n log n)
  3. O(n)
  4. O(n²)

답: O(n²). 피벗이 나쁘면 매번 한쪽에 n − 1개가 남아 O(n²)이 됩니다. O(n log n)은 평균의 경우이며 병합 정렬의 최악의 경우입니다.

4단계별 방법

코드 조각의 시간 복잡도를 구하려면:

  1. n이 무엇인지 정하세요: 입력의 크기.
  2. 각 반복문이 몇 번 도는지 세세요. 매번 1씩 더하는 반복문은 약 n번 돕니다. 두 배로 하거나 절반으로 하는 반복문은 약 log₂ n번 돕니다.
  3. 안에 들어 있는 반복문은 곱합니다. 차례로 이어지는 반복문은 더합니다.
  4. 재귀 함수는 점화식을 쓰세요. 몇 번 호출하는지, 어떤 크기인지, 호출당 작업량은 얼마인지.
  5. 가장 빨리 커지는 항만 남기고 상수는 버리세요.
  6. 작은 수로 확인하세요. 예를 들어 n = 8 또는 n = 1024.

이론 문제에서는 먼저 그것이 설명하는 알고리즘이나 아이디어의 이름을 말하고, 그다음 복잡도와 조건(정렬된 입력, 음이 아닌 가중치, 겹치는 부분 문제)을 떠올리세요.

5풀이 예제

모든 단계를 따라가 보세요. 다음 단계를 열기 전에 미리 예측해 보세요.

풀이 예제

이 코드의 시간 복잡도는 무엇인가? for i = 1 to n: (j = 1; while j < n: j = j × 2)

1

입력 크기 정하기

n은 반복문이 올라가는 수입니다.

2

바깥 반복문 세기

i는 1부터 n까지 1씩 늘어나므로 바깥 반복문은 n번 돕니다.

3

안쪽 반복문 세기

j는 1, 2, 4, 8, …의 값을 가지며 n에 이르면 멈춥니다. k번 돌고 나면 j = 2k이므로 반복문은 약 log₂ n번 돈 뒤 멈춥니다.

4

반복문 합치기

안쪽 반복문이 바깥 반복문 안에 있으므로 횟수를 곱합니다.

n · log₂ n ⇒ O(n log n)
5

수로 확인하기

n = 1024이면 안쪽 반복문은 log₂ 1024 = 10번 돌므로 본문은 1024 · 10 = 10 240번 실행됩니다. 이는 n² = 1 048 576보다 훨씬 작습니다.

답

O(n log n)

6흔한 실수

  • 차례로 이어지는 반복문을 곱하는 것. n + n = 2n도 여전히 O(n)입니다.
  • O(2n)이나 O(n/2)처럼 상수를 남기는 것. 둘 다 O(n)입니다.
  • 두 배로 늘리는 반복문을 n번 도는 것으로 세는 것. 약 log₂ n번 돕니다.
  • 정렬되지 않은 데이터나 가운데에 한 번에 접근할 수 없는 연결 리스트에 이진 탐색을 쓰는 것.
  • 최악의 경우를 물었는데 퀵 정렬의 평균 경우를 답하는 것.
  • 빅오가 “정확히”를 뜻한다고 생각하는 것. O(n²)은 상한이고, Θ(n²)이 정확한 증가율입니다.
자가 점검 어떤 함수가 n번 반복하는 반복문을 돌고, 그다음 따로 n번 반복하는 다른 반복문을 돈다. 시간 복잡도는 무엇인가?
  1. O(2n)
  2. O(log n)
  3. O(n)
  4. O(n²)

답: O(n). 차례로 이어지는 반복문은 더합니다. n + n = 2n이고 상수는 버리므로 O(n)입니다. O(n²)은 한 반복문이 다른 반복문 안에 있을 때만 맞습니다.

7시험 문제의 유형

  • 쉬움: 핵심 용어와 사실. 이진 탐색, 병합 정렬, 배열 접근의 복잡도, O, Ω, Θ의 뜻, 재귀란 무엇인가.
  • 보통: 개념 적용. 코드 조각의 복잡도, 풀어야 할 점화식, n이 두 배가 될 때 시간이 어떻게 변하는지, 과제에 맞는 알고리즘.
  • 어려움: 사례와 분석. 마스터 정리, 퀵 정렬의 최악의 경우, 탐욕과 동적 계획법의 비교, P, NP, NP-완전 부류.

P는 다항 시간에 풀 수 있는 문제를 포함합니다. NP는 해를 다항 시간에 확인할 수 있는 문제를 포함합니다. P의 모든 문제는 NP에 속하며, P = NP인지는 아직 알려지지 않았습니다.

앱에서 단계별로 배우기앱에서 단계별로 배우기

예제 문제

예제 1쉬움

증가율의 상한(upper bound)을 나타내는 표기법은 무엇입니까?

  1. ABig Omega
  2. BLittle omega
  3. CBig O
  4. DBig Theta
힌트 보기
  1. "최대"를 의미합니다.
  2. 오답 두 개를 지웠습니다. 남은 두 개 중 하나가 정답입니다.
정답과 설명 보기

이것이 답인 이유

O는 상한, Ω는 하한, Θ는 정확한 한계(tight bound)를 나타냅니다.

답

C · Big O
예제 2보통

정렬된 배열에서 양 끝에서 포인터를 하나씩 안쪽으로 움직이며 합이 목표값인 두 원소를 찾습니다. 시간 복잡도는 무엇입니까?

  1. AO(n)
  2. BO(n log n)
  3. CO(n²)
  4. DO(log n)
힌트 보기
  1. 각 단계에서 포인터 하나가 한 칸 움직입니다.
  2. 오답 두 개를 지웠습니다. 남은 두 개 중 하나가 정답입니다.
정답과 설명 보기

이것이 답인 이유

합이 너무 작으면 왼쪽 포인터가 오른쪽으로, 너무 크면 오른쪽 포인터가 왼쪽으로 움직이므로 단계는 최대 n번입니다.

답

A · O(n)
예제 3어려움

슈트라센 알고리즘은 절반 크기 블록의 재귀 곱셈을 8번 대신 7번 사용하여 행렬을 곱합니다. 실행 시간은 얼마입니까?

  1. AΘ(n² log n)
  2. BΘ(n2)
  3. CΘ(n³)
  4. DΘ(nlog₂ 7), 약 n2.81
힌트 보기
  1. 점화식은 T(n) = 7T(n/2) + O(n²)입니다.
  2. 오답 두 개를 지웠습니다. 남은 두 개 중 하나가 정답입니다.
정답과 설명 보기

이것이 답인 이유

a = 7, b = 2이므로 nlog₂ 7이 O(n²)의 덧셈 작업을 지배하여 약 n2.81이 됩니다.

답

D · Θ(nlog₂ 7), 약 n2.81

질문과 답변

알고리즘과 복잡도: 무엇인가요?

두 알고리즘이 같은 문제를 풀어도 걸리는 시간은 크게 다를 수 있습니다. 복잡도는 입력이 커질 때 작업량이 어떻게 늘어나는지를 나타냅니다.

입력의 크기를 n이라고 합니다. 정렬할 항목의 수, 목록의 길이, 그래프의 노드 수 등입니다.

알고리즘과 복잡도: 단계별로 어떻게 배우나요?
  1. 복잡도가 재는 것
  2. 빅오와 증가율의 부류
  3. 탐색, 정렬, 재귀
  4. 단계별 방법
  5. 풀이 예제
  6. 흔한 실수
  7. 시험 문제의 유형
알고리즘과 복잡도 연습에서는 무엇을 다루나요?
  • 쉬움: 핵심 용어와 사실
  • 보통: 개념 적용
  • 어려움: 사례와 분석

모든 문제에는 선택지가 네 개 있고, 정답은 하나뿐입니다. 막혔나요? 먼저 작은 힌트를 열고, 필요할 때만 전체 해설을 보세요.

연습 방법

  • 모든 문제에는 선택지가 네 개 있고, 정답은 하나뿐입니다.
  • 막혔나요? 먼저 작은 힌트를 열고, 필요할 때만 전체 해설을 보세요.
  • 진행 상황, 틀린 문제, 저장한 문제가 보관되므로 시험 전에 복습할 수 있습니다.

이 주제의 앞뒤 주제

다음 단계

이 주제가 포함된 강의

컴퓨터 과학의 다른 주제

인쇄용 학습지

알고리즘과 복잡도 무료로 연습하기지금 알고리즘과 복잡도 연습하기매일 무료 문제 5개. 카드 등록이 필요 없습니다.