📘 CodingMarble Learn

알고리즘 설계 기법

알고리즘을 설계하려면 먼저 문제를 명세해요. 어떤 데이터가 들어오는지(입력), 무엇을 내놓아야 하는지(출력), 어떤 조건이 있는지를 정해요. 그다음 분명하고 끝이 있는 단계를 말, 목록, 의사코드, 순서도로 적어요. 큰 문제는 위에서 아래로 작게 쪼개거나(단계적 세분화), 작고 검증된 조각을 쌓아 올려 만들어요. 대표 기법은 완전 탐색(전부 해 보기), 분할 정복(나누고, 풀고, 합치기. 이진 탐색과 병합 정렬처럼 반씩 줄이기), 그리디(그때그때 가장 좋아 보이는 선택. 빠르지만 항상 최선은 아님), 동적 계획법(작은 부분 문제를 한 번만 풀어 표에 저장), 백트래킹(선택해 보고 막다른 길이면 되돌리기)이에요. 정확성과 효율(시간 복잡도)을 따져서 기법과 자료구조(배열, 스택, 이진 트리)를 골라요.

🎬 단계별 이야기

  1. 먼저 문제를 명세해요. 입력은 숫자 8개, 출력은 가장 큰 수예요. 상자를 하나씩 보면서 지금까지 가장 큰 수를 기억해요.
  2. 분할 정복: 1부터 16 중 수를 맞히려면 가운데를 물어보고 절반을 버려요. 질문은 4번이면 돼요.
  3. 그리디: 들어가는 가장 큰 동전부터 골라요. 빠르지만, 동전 1, 3, 4로 6을 만들면 3개가 나와요. 최선은 2개인데요.
  4. 동적 계획법: 작은 금액부터 풀고 답을 표에 저장해요. 표를 보면 6 = 3 + 3이라는 걸 알 수 있어요.
  5. 백트래킹: 길을 따라 걷다가 막다른 길이면 마지막 갈림길로 돌아가 다른 길을 시도해요. 출구에 닿을 때까지요.
  6. 이제 네 차례예요. 금액과 동전을 골라 보세요. 그리디가 가장 적은 동전을 줄까요? DP와 비교해 보세요.

팁: 3D 화면을 드래그하면 돌아가요. 두 손가락으로 확대할 수 있어요.

🤔 헷갈리는 점, 한 번에 해결

코딩하기 전에 왜 입력과 출력부터 적을까요?

무엇이 들어오고 무엇이 나가야 하는지 정확히 모르면, 단계가 맞는지 시험할 수 없어요.

숫자가 16개인데 어떻게 질문 4번이면 충분할까요?

답을 들을 때마다 절반이 사라져요: 16, 8, 4, 2, 1. 회색으로 바뀐 상자가 버려진 절반이에요.

그리디가 틀릴 수 있다면 왜 쓸까요?

아주 빠르고 간단하고, 많은 문제(보통 동전, 일찍 끝나는 활동)에서는 맞는다고 증명되어 있어요.

DP는 전부 해 보는 것과 어떻게 다를까요?

작은 금액을 하나씩 한 번만 풀어 다시 쓰기 때문에, 모든 조합을 뒤지지 않고 표가 한 칸씩 자라요.

백트래킹은 처음부터 다시 시작할까요?

아니에요. 아직 안 가 본 길이 있는 마지막 갈림길까지만 돌아가서 거기서 이어 가요.

내 동전에서 그리디가 통하는지 어떻게 알까요?

여러 금액에서 DP와 비교해 봐요. 자유 놀이에서 동전 1, 7, 10을 해 보세요.

문제 명세하기: 입력, 출력, 단계

코드를 쓰기 전에 문제를 정확히 설명해요. 이것을 명세라고 해요.

단계 적기

알고리즘은 올바른 입력이면 무엇이든 맞는 출력으로 바꿔 주는, 끝이 있는 분명한 단계의 목록이에요. 이렇게 적을 수 있어요.

작은 입력으로 손으로 직접 해 봐요. 까다로운 경우도 꼭 넣어요(모두 같은 수, 음수, 수가 하나뿐일 때).

탑다운 설계와 바텀업 설계

탑다운(단계적 세분화): 전체 일에서 시작해 큰 단계 몇 개로 나누고, 각 단계를 다시 나눠요. 쉽게 코드로 옮길 수 있을 때까지요. 예: "성적표 만들기" → 점수 읽기 → 평균 구하기 → 등급 매기기 → 출력하기.

바텀업: 먼저 작고 다시 쓸 수 있는 조각(최댓값을 찾는 함수, 정렬하는 함수)을 만들어 시험하고, 그다음 이어 붙여 전체 프로그램을 만들어요.

실제 프로젝트는 둘을 섞어요. 계획은 탑다운으로, 만들고 시험하기는 바텀업으로 해요.

분할 정복과 반씩 줄이기

분할 정복은 세 동작이에요. 같은 종류의 더 작은 조각으로 문제를 나누고, 각 조각을 (보통 재귀로) 풀고, 답을 합쳐요.

그리디 알고리즘

그리디 알고리즘은 지금 가장 좋아 보이는 선택을 하고 절대 바꾸지 않아요.

하지만 그리디가 항상 맞는 것은 아니에요. 동전 1, 3, 4로 6을 그리디로 내면 4 + 1 + 1(3개)인데, 3 + 3은 2개예요. 그리디를 믿으려면 증명하거나, 확실한 방법과 비교해 시험해야 해요.

동적 계획법과 백트래킹

동적 계획법(DP)

같은 작은 문제가 되풀이되면 각각을 한 번만 풀어 답을 표에 저장해요. 금액 a의 최소 동전 수: best[a] = 1 + min(best[a - c]) (c ≤ a인 동전 c마다), 시작은 best[0] = 0. 동전 1, 3, 4이면 best = 0, 1, 2, 1, 1, 2, 2. 표를 작은 값에서 큰 값으로 채우면 바텀업이고, 기억을 쓰는 재귀는 탑다운(메모이제이션)이에요. 더 자세한 내용은 따로 있는 동적 계획법 수업에서 봐요.

백트래킹

선택을 하나씩 쌓으며 답을 만들어요. 선택이 규칙을 어기거나 막다른 길이면 되돌리고 다음 선택지를 시도해요. 미로, 스도쿠, N-퀸 퍼즐, 모든 부분집합 나열에 써요. 안 될 가지를 통째로 건너뛰는, 똑똑한 완전 탐색이에요.

완전 탐색

가능한 답을 전부 해 봐요. 항상 맞지만 너무 느린 경우가 많아요(부분집합 2ⁿ개, 순서 n!가지).

기법 고르기: 정확성, 효율, 자료구조

기법쓰는 때예보통 시간
완전 탐색입력이 아주 작을 때세 자리 비밀번호 전부 해 보기자주 2ⁿ 또는 n!
분할 정복조각이 서로 독립일 때이진 탐색, 병합 정렬O(log n), O(n log n)
그리디지금의 최선이 안전하다고 증명됐을 때활동 선택, 거스름돈O(n log n)
동적 계획법작은 문제가 되풀이될 때동전 문제, 최단 경로표의 크기
백트래킹규칙이 있는 탐색미로, 스도쿠지수 시간, 하지만 가지치기

근거를 대요

정확성: 알고리즘이 항상 끝나고 맞는 출력을 준다는 것을 보여요(루프 불변식, 증명, 극단적인 경우의 시험). 효율: n이 커질 때 단계 수를 세고(빅오) 다른 방법과 비교해요.

자료구조가 도와줘요

배열은 표(DP)에, 스택은 백트래킹(어디로 돌아갈지 기억)에, 큐는 층별 탐색에 써요. 이진 트리는 각 노드가 자식을 최대 둘 갖도록 데이터를 저장해요. 이진 탐색 트리에서는 작은 키는 왼쪽, 큰 키는 오른쪽에 두어서, 한 층 내려갈 때마다 일이 반으로 줄어요. 이진 탐색과 똑같아요.

직접 해 보기: 동전과 숫자 맞히기

  1. 친구와 1~100 숫자 맞히기를 해 봐요. 늘 가운데를 물어봐요. 7번 안에 항상 이길 수 있을까요? (2⁷ = 128.)
  2. 동전 1, 3, 4로 금액 0부터 10까지 DP 표를 종이에 써 봐요. 그리디는 어디서 틀릴까요?
  3. 마지막 3D 단계를 열어요. 동전 1, 7, 10과 금액 14를 해 봐요. 그리디는 10 + 1 + 1 + 1 + 1, DP는 7 + 7이에요.
  4. "목록에서 가장 작은 수 찾기"의 단계 목록을 쓰고, 5, 5, 5와 수가 하나뿐인 경우로 시험해 봐요.

핵심 공식과 정의

풀이 예제

1. n개의 수 중 가장 큰 수를 찾는 명세와 단계 목록을 써 보세요.

입력: n ≥ 1개의 수. 출력: 가장 큰 수. 단계: 1. best ← 첫 번째 수. 2. 나머지 수 x마다: x > best이면 best ← x. 3. best를 출력. 4, 9, 2, 7, 12, 5, 10, 3이면 비교 7번 뒤에 출력은 12예요.

2. 1부터 1000 중 수를 찾으려면 반씩 줄이기로 질문이 몇 번 필요할까요?

질문마다 범위가 반이 돼요: 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1. 질문은 10번이에요 (2¹⁰ = 1024 ≥ 1000).

3. 동전 50, 20, 10, 5, 2, 1로 87을 그리디로 내 보세요.

50 (37 남음), 20 (17), 10 (7), 5 (2), 2 (0): 50 + 20 + 10 + 5 + 2 = 동전 5개.

4. 동전 1, 3, 4로 금액 7까지 DP 표를 채워 보세요.

best[0]=0, [1]=1, [2]=2, [3]=1, [4]=1, [5]=min(best4, best2, best1)+1=2, [6]=min(best5, best3, best2)+1=2, [7]=min(best6, best4, best3)+1=2 (3 + 4).

5. 활동(시작-끝): A 9-11, B 10-12, C 11-13, D 12-14, E 13-15. 겹치지 않게 가장 많은 활동을 고르세요.

끝나는 시각이 가장 이른 것부터 그리디로: A (11에 끝남), 그다음 C (11에 시작, 13에 끝남), 그다음 E (13에 시작). 활동 3개: A, C, E.

6. 탑다운으로 계획해 보세요: 반의 평균 점수와 1등 학생을 알려 주는 프로그램.

1단계: 데이터 읽기 → 계산 → 출력. 2단계: 이름과 점수를 목록에 읽기. 합계와 평균 구하기. 최고 점수와 그 이름 찾기. 둘 다 출력. 그다음 각 조각을 바텀업으로 코딩하고 시험해요.

자주 하는 실수

연습 퀴즈

1. 문제 명세에 꼭 들어가야 하는 것은?
2. 정렬된 16개에 이진 탐색을 하면 많아야 약 몇 번 확인할까요?
3. 지금 가장 좋아 보이는 선택을 늘 하는 기법은?
4. 동적 계획법이 잘 맞는 때는?
5. 미로 탐색에서 막다른 길 뒤에 마지막 갈림길로 돌아가는 것은?

연습: 직접 풀어 보세요

답을 입력하거나 고른 뒤 확인을 누르세요. 막히면 힌트를 보세요. 풀이는 답을 낸 뒤에 나타나요.

자주 묻는 질문

알고리즘 설계의 주요 기법은 무엇인가요?

완전 탐색, 분할 정복, 그리디, 동적 계획법, 백트래킹이에요. 입력과 출력을 명세한 뒤에 골라요.

그리디와 동적 계획법은 어떻게 다른가요?

그리디는 단계마다 가장 좋아 보이는 선택 하나를 하고 뒤돌아보지 않아요. DP는 작은 부분 문제의 모든 선택을 살펴 최선의 답을 저장하므로, 부분 문제가 겹칠 때 진짜 최적해를 찾아요.

탑다운 설계와 바텀업 설계는 무엇이 다른가요?

탑다운은 전체 일을 더 작은 단계로 나누고, 바텀업은 작은 부분을 먼저 만들어 시험한 뒤 이어 붙여요. 대부분의 프로그램은 둘 다 써요.

배우는 곳

PolandSzkoła podstawowa, klasa VIIUnderstanding, analysing and solving problems
PolandSzkoła podstawowa, klasa VIIIUnderstanding, analysing and solving problems
PolandLiceum ogólnokształcące, klasa IUnderstanding, analysing and solving problems
China高三Electives (选修)

먼저 배우기

다음에 배우기

관련 수업

Computer Science 수업 전체