- 복잡한 문제를 해결 가능한 작은 문제로 분해할 수 있다.
- 문제 해결에 필요한 요소만 남기는 모델링(단순화·구조화)을 수행할 수 있다.
- 작은 문제들의 해결 결과를 종합하며 누락과 오류가 없는지 확인할 수 있다.
생각 열기 — 3단계면 충분하다?
유명한 농담이 있죠. "코끼리를 냉장고에 넣는 방법은? ① 냉장고 문을 연다 ② 코끼리를 넣는다 ③ 문을 닫는다." 웃기지만, 사실 이 농담은 알고리즘 설계의 핵심 교훈을 담고 있어요 — 단계처럼 보여도, 실행할 수 없으면 해결책이 아니다. "② 코끼리를 넣는다"는 그 자체로 거대한 문제죠. 그렇다면 진짜 해결자는 어떻게 할까요? ②를 다시 잘게 나눕니다. 코끼리를 옮길 방법, 들어갈 크기의 냉장고를 구할 방법, … 해결 가능한 크기가 될 때까지.
"수학 성적 올리기"라는 막막한 목표, 오늘 당장 실행할 수 있는 크기의 작은 목표 3개로 나눈다면 어떻게 나눌 수 있을까요? 그리고 나눈 것들을 모두 해내면 정말 원래 목표가 이뤄질까요? — 이 두 가지 질문이 오늘 수업의 전부입니다!
문제 분해 — 잘게 나누면 길이 보인다
복잡한 문제를 이기는 가장 오래된 전략
문제 분해(decomposition)는 복잡한 문제를 해결 가능한 크기의 작은 문제들로 나누는 거예요. 자동차 공장이 '자동차 만들기'라는 거대한 일을 수백 개의 공정으로 나누듯, 소프트웨어 개발자도 '앱 만들기'를 수많은 작은 기능으로 나눠 정복합니다.
좋은 분해의 세 가지 조건
충분히 작게
각 조각은 "바로 해결 방법이 떠오르는" 크기여야 해요. 크면 더 나누기!
모으면 완전하게
조각을 전부 해결하면 원래 문제가 해결되어야 해요. 빠진 조각이 없는지!
겹치지 않게
조각끼리 같은 일을 중복하면 낭비와 충돌이 생겨요.
노란 배지(아직 커요!)가 붙은 문제를 클릭해 더 작은 문제로 분해해 보세요. 초록 배지가 나오면 바로 해결할 수 있는 크기에 도달한 거예요!
모델링 — 필요한 것만 남기는 용기
현실은 복잡하다, 모델은 단순하다
분해와 함께 쓰는 두 번째 무기가 모델링(modeling)이에요. 현실의 문제에는 정보가 너무 많아요. 그래서 문제 해결에 필요한 것만 남기고(단순화), 남긴 것들의 관계를 정리합니다(구조화). 가장 유명한 모델이 바로 여러분 주머니 속에 있어요 — 지하철 노선도!
이렇게 핵심만 남기고 나머지를 과감히 버리는 사고를 추상화(abstraction)라고 해요. 모델링은 추상화를 실천하는 대표적인 방법이고, 앞서 배운 문제 분해 역시 '구조'에 집중하는 추상화의 한 형태랍니다.
노선도에는 한강의 모양도, 실제 거리도 없지만 "강남에서 광화문까지 어떻게 가지?"라는 문제는 완벽하게 풀어 줘요. 반대로 등산할 때는 노선도가 아니라 등고선 지도가 필요하죠. 무엇을 남기고 무엇을 버릴지는 '해결하려는 문제'가 결정합니다. 이것이 2단원에서 배운 '문제가 데이터를 결정한다'와 똑같은 원리!
문제: "점심시간 급식실 대기 시간을 예측하는 프로그램"을 만들려고 해요. 아래 정보 중 이 모델에 꼭 필요한 것만 골라(클릭) 모델을 완성하세요!
💡 이름과 혈액형은 그 학생에겐 소중하지만 대기 시간 예측이라는 문제에는 필요 없어요. 대기 시간 ≈ 줄 길이 × 1인 배식 시간 ÷ 배식대 수, 그리고 줄 길이는 학년별 급식 시작 시각에 따라 출렁이죠 — 남긴 요소들의 관계까지 정하면 모델 완성!
다시 합치기 — 종합과 오류 확인
분해의 마지막 단계는 '검산'이다
작은 문제들을 모두 해결했다면, 이제 결과를 종합해 원래의 큰 문제가 풀렸는지 확인할 차례예요. 이때 두 가지를 점검합니다 — ① 빠진 조각은 없는가? (전부 합쳐도 원래 문제가 안 풀리면 분해에 구멍이 있던 것) ② 조각끼리 충돌하지 않는가? (각자는 완벽한데 합치면 오류가 나는 경우). 전문 개발자들이 모듈을 합칠 때마다 '통합 테스트'를 하는 이유가 바로 이것이죠.
빠진 조각을 찾아라
1문항 · 즉시 채점
1"자동 세차하기"를 ① 물 뿌리기 ② 세제 칠하기 ③ 솔질하기 ④ 말리기 로 분해했다. 종합 점검에서 발견해야 할 문제는?
모둠별로 다음 중 하나를 골라(또는 직접 정해) 분해 트리와 모델을 만들어 보세요.
📋 후보: 교실 자리 바꾸기 프로그램 / 동아리 홍보 영상 제작 / 학급 비상연락망 앱 / 모의고사 D-day 공부 계획
- 분해: 문제를 2단계 이상의 트리로 분해한다. 막내 조각마다 "바로 해결 가능한가?"를 표시한다.
- 점검: 좋은 분해의 세 조건(작게 / 완전하게 / 겹치지 않게)으로 서로의 트리를 평가한다.
- 모델링: 문제 해결에 필요한 정보(데이터)만 골라 목록을 만들고, 정보들 사이의 관계를 화살표나 수식으로 표현한다.
- 종합 시나리오: 조각들을 어떤 순서로 합칠지, 합친 뒤 무엇을 확인할지 적는다.
💡 이 분해 트리는 버리지 마세요 — 9차시 협력 프로젝트에서 진짜 프로그램으로 구현할 수 있는 훌륭한 설계도가 됩니다!
확인 문제
바로바로 채점! 해설까지 꼭 읽어 보세요.
1차시 확인 문제
4문항 · 즉시 채점
1문제 분해에 대한 설명으로 가장 적절한 것은?
2지하철 노선도가 훌륭한 '모델'인 이유는?
3모델링에서 '남길 정보'와 '버릴 정보'를 결정하는 기준은?
4좋은 문제 분해의 조건이 아닌 것은?
더 알아보기
교육과정 너머, 궁금한 만큼 깊이!
예고분해가 알고리즘이 되면 — 분할 정복
문제 분해를 알고리즘 설계에 그대로 적용한 전략이 분할 정복(divide and conquer)이에요. 문제를 반으로 나누고, 또 반으로 나누고… 아주 작아진 문제를 풀어서 거꾸로 합쳐 올라옵니다.
예를 들어 1,000명의 시험지를 점수순으로 정렬한다면 — 500장씩 두 묶음으로 나눠 각각 정렬하고, 정렬된 두 묶음을 합치는(merge) 거예요. 500장은 다시 250장씩… 이것이 병합 정렬이고, 다음 차시에서 배울 단순한 정렬들보다 압도적으로 빠릅니다. 분해는 그냥 정리 기술이 아니라 속도를 만드는 기술이기도 해요!
장수를 정하고 버튼을 누르면, 1장이 될 때까지 반씩 나누는 과정이 펼쳐집니다.
역사전 세계 지하철 노선도의 아버지 — 해리 벡
1931년까지 런던 지하철 노선도는 실제 지형 위에 노선을 그린 '정확하지만 읽기 힘든' 지도였어요. 전기 회로 도면을 그리던 직원 해리 벡은 과감한 제안을 합니다 — "승객에게 중요한 건 실제 거리가 아니라 연결이다. 회로도처럼 그리자!"
거리 비례를 버리고 45도·90도 직선만으로 그린 그의 노선도는 처음엔 "지도가 아니다"라며 거절당했지만, 시험 배포되자마자 폭발적인 인기를 얻었고, 오늘날 전 세계 모든 지하철 노선도의 표준이 되었습니다. 좋은 모델은 현실을 베끼지 않고, 문제를 풀어 준다 — 해리 벡이 남긴 교훈이에요.
두 그림은 완전히 같은 노선망이에요 — 역의 순서와 환승 관계는 그대로 두고 지리 정보만 버렸을 뿐. 어느 쪽으로 길을 찾고 싶나요?
심화현실의 소프트웨어는 이렇게 분해된다 — 모듈과 함수
여러분이 쓰는 메신저 앱도 거대한 분해 트리예요. 메시지 전송 모듈, 알림 모듈, 친구 목록 모듈… 각 모듈은 다시 수십 개의 함수(function) — "사진을 압축한다", "읽음 표시를 갱신한다" 같은 작은 일 하나만 하는 코드 조각 — 로 나뉩니다.
이렇게 나누면 ① 여러 명이 동시에 나눠 개발할 수 있고 ② 오류가 나면 그 조각만 고치면 되고 ③ 잘 만든 조각은 다른 곳에 재사용할 수 있어요. 9차시 협력 프로젝트에서 여러분도 모둠원과 조각을 나눠 만들게 됩니다 — 그때 오늘의 분해 실력이 빛을 발해요!
융합수학·과학도 모델링으로 — 전염병 예측 모델
코로나19 때 "다음 주 확진자 수" 예측은 어떻게 했을까요? 전 국민 한 명 한 명을 추적한 게 아니라, 사람들을 단 세 그룹 — S(감염될 수 있는 사람), I(감염된 사람), R(회복된 사람) — 으로 단순화한 'SIR 모델'을 썼어요. 이름도, 직업도, 사는 곳도 다 버리고 '감염 상태'만 남긴 과감한 모델링이죠.
이 단순한 모델이 마스크 정책, 거리두기 단계 같은 국가적 결정의 근거가 되었습니다. 기상 예보, 경제 전망, 우주선 궤도 계산 — 세상의 모든 예측은 결국 잘 버린 모델 위에서 이루어져요.
주민 1,000명, 첫 감염자 5명, 매일 감염자의 10%가 회복하는 가상 마을이에요. 슬라이더의 감염력 β(감염자 한 명이 하루에 옮기는 정도)만으로 유행 전체가 결정됩니다 — 이름도 직업도 버린 모델의 힘!
한눈에 정리
- 문제 분해 = 복잡한 문제를 해결 가능한 크기의 작은 문제로 나누기 — 작게, 완전하게, 겹치지 않게
- 모델링 = 문제 해결에 필요한 것만 남기는 단순화 + 남긴 것들의 관계를 정하는 구조화
- 무엇을 남길지는 해결하려는 문제가 결정한다 (노선도 vs 등산 지도)
- 마지막은 종합과 오류 확인 — 빠진 조각은 없는가? 조각끼리 충돌하지 않는가?
- 분해·모델링은 2~9차시 전체(정렬·탐색·프로그래밍·프로젝트)를 떠받치는 기초 체력!